CONFIG.C
上传用户:xiaogehua
上传日期:2007-01-08
资源大小:1183k
文件大小:15k
源码类别:

操作系统开发

开发平台:

Asm

  1. /*
  2. ;    File              : $Workfile: CONFIG.C$
  3. ;
  4. ;    Description       :
  5. ;
  6. ;    Original Author   : DIGITAL RESEARCH
  7. ;
  8. ;    Last Edited By    : $CALDERA$
  9. ;
  10. ;-----------------------------------------------------------------------;
  11. ;    Copyright Work of Caldera, Inc. All Rights Reserved.
  12. ;      
  13. ;    THIS WORK IS A COPYRIGHT WORK AND CONTAINS CONFIDENTIAL,
  14. ;    PROPRIETARY AND TRADE SECRET INFORMATION OF CALDERA, INC.
  15. ;    ACCESS TO THIS WORK IS RESTRICTED TO (I) CALDERA, INC. EMPLOYEES
  16. ;    WHO HAVE A NEED TO KNOW TO PERFORM TASKS WITHIN THE SCOPE OF
  17. ;    THEIR ASSIGNMENTS AND (II) ENTITIES OTHER THAN CALDERA, INC. WHO
  18. ;    HAVE ACCEPTED THE CALDERA OPENDOS SOURCE LICENSE OR OTHER CALDERA LICENSE
  19. ;    AGREEMENTS. EXCEPT UNDER THE EXPRESS TERMS OF THE CALDERA LICENSE
  20. ;    AGREEMENT NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED,
  21. ;    COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED,
  22. ;    CONDENSED, EXPANDED, COLLECTED, COMPILED, LINKED, RECAST,
  23. ;    TRANSFORMED OR ADAPTED WITHOUT THE PRIOR WRITTEN CONSENT OF
  24. ;    CALDERA, INC. ANY USE OR EXPLOITATION OF THIS WORK WITHOUT
  25. ;    AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO CRIMINAL AND
  26. ;    CIVIL LIABILITY.
  27. ;-----------------------------------------------------------------------;
  28. ;
  29. ;    *** Current Edit History ***
  30. ;    *** End of Current Edit History ***
  31. ;
  32. ;    $Log$
  33. ;  ENDLOG
  34. */
  35. /*
  36.  * 28 Oct 87 Always decrement the MEMSIZE field by 0x0A paragraphs to
  37.  * allow for the SAT's.
  38.  *  9 Nov 87 Recheck the login vector after detemining the specified
  39.  * drive in NETDRIVE.
  40.  *  9 Dec 87 Always display Physically Remote drives as Remote. 
  41.  * 28 Jan 88 Support the CTTY command for DOS Plus command interpreter
  42.  * 27 May 88  Added string undefs.
  43.  * 15 Jun 88 DBG is now permanent.
  44.  * 23 Jun 88 Use new ONOFF function for XXX [=] ON|OFF parsing 
  45.  * 29 Jun 88 Check OWNER field in ?CB for valid AUX and LIST devices
  46.  *  5 Aug 88 Let L_SET and A_SET determine the validity of a Device No.
  47.  * 12 Aug 88 Enforce default AUX and PRINTER on COM1 and LPT1 mapping
  48.  *  7 Feb 89 Support the CHCP command for DR DOS
  49.  * 14 Apr 89 cmd_chcp: Print relevant msg if ED_FILE returned
  50.  * 30 Aug 89 DR Dos idle command
  51.  * 30 Oct 89 "DEBUG is" moved to message.c (ie. non-resident)
  52.  * 6-Mar-90  Watcom C v 7.0
  53.  * 20-Sep-90 is_filechar() now takes pointer instead of byte.
  54.  * 2-Oct-90  Prevent exec of XSTOP.EXE from within STOP command
  55.  * 3-Oct-90  remove 8087 command
  56.  * 4-Oct-90  Netdrive goes CCB based
  57.  * 12-Oct-90 cmd_printer/cmd_aux removed (now part of printmap)
  58.  * 12-Oct-90 NETDRIVE now says "netdrive d: /Local" to aid Richard
  59.  * (You can save and restore state in batch files)
  60.  */
  61. #include "defines.h"
  62. #include <string.h>
  63. #if defined(MWC) && defined(strlen)
  64. #undef strcmp /* These are defined as macros in string.h */
  65. #undef strcpy /* which are expaneded in line under */
  66. #undef strlen /* Metaware C. These undefs avoid this. */
  67. #endif
  68. #include <portab.h>
  69. #include <mserror.h>
  70. #if !defined(DOSPLUS)
  71. #include <pd.h>
  72. #include <ccpm.h>
  73. #include <sysdat.h>
  74. #else
  75. #include <idle.h> /*#NOIDLE#*/
  76. #endif
  77. #include "command.h" /* COMMAND Definitions */
  78. #include "support.h"
  79. #include "dosif.h" /* DOS interface definitions  */
  80. #include "toupper.h"
  81. #include "global.h"
  82. /*
  83.  * USER BEWARE
  84.  *
  85.  * A process descriptor exists in both DOS Plus and Concurrent
  86.  * DOS. But is an internal Structure in DOS Plus and should only
  87.  * be used with the upmost care.
  88.  */
  89. #if !defined(DOSPLUS)
  90. EXTERN PD FAR * CDECL pd; /* Far pointer to Current PD */
  91. #endif
  92. MLOCAL VOID setflag(cmd, msg, field, flag)
  93. BYTE *cmd; /* Pointer to the Users Command Line */
  94. BYTE *msg; /* Status Message String */
  95. UWORD FAR *field; /* FAR pointer to the Flags field */
  96. UWORD flag; /* The Flag to be updated */
  97. {
  98. switch(onoff(cmd)) { /* Check for "=on/off"     */
  99.     case YES: /* Turn Flag ON     */
  100. *field |= flag;
  101. break;
  102.     case NO: /* Turn Flag OFF     */
  103. *field &= ~flag;
  104. break;
  105.     default:
  106. if(*deblank(cmd)) /* Display an error message */
  107.     printf(MSG_ONOFF); /* for a non blank commnad  */
  108. else
  109.          printf(msg, *field & flag ? MSG_ON : MSG_OFF);
  110. break;
  111. }
  112. }
  113. /*.pa*/
  114. #if defined(CDOSTMP)
  115. /*
  116.  * BREAK [ON|OFF]
  117.  */
  118. GLOBAL VOID CDECL cmd_break(cmd)
  119. REG BYTE    *cmd;
  120. {
  121. setflag(cmd, MSG_BREAK, (UWORD FAR *) &pd->P_SFLAG, PSF_BREAK);
  122. }
  123. /*
  124.  * VERIFY [ON|OFF]
  125.  */
  126. GLOBAL VOID CDECL cmd_verify(cmd)
  127. REG BYTE    *cmd;
  128. {
  129. setflag(cmd, MSG_VERIFY, (UWORD FAR *) &pd->P_SFLAG, PSF_VERIFY);
  130. }
  131. #else
  132. /*
  133.  * BREAK [ON|OFF]
  134.  *
  135.  * The break flag is emulated during by the COMMAND processor and
  136.  * only set to the users value when a program is loaded or when
  137.  * leaving COMMAND.COM using the EXIT command.
  138.  */
  139. GLOBAL VOID CDECL cmd_break(cmd)
  140. REG BYTE    *cmd;
  141. {
  142. switch(onoff(cmd)) { /* Check for "=on/off"     */
  143.     case YES: /* Turn Flag ON     */
  144. break_flag = YES;
  145. break;
  146.     case NO: /* Turn Flag OFF     */
  147. break_flag = NO;
  148. break;
  149.     default:
  150. if(*deblank(cmd)) /* Display an error message */
  151.     printf(MSG_ONOFF); /* for a non blank commnad  */
  152. else
  153.          printf(MSG_BREAK, break_flag ? MSG_ON : MSG_OFF);
  154. break;
  155. }
  156. }
  157. /*
  158.  * VERIFY [ON|OFF]
  159.  */
  160. GLOBAL VOID CDECL cmd_verify(cmd)
  161. REG BYTE    *cmd;
  162. {
  163. switch(onoff(cmd)) { /* Check for "=on/off"     */
  164.     case YES: /* Turn Flag ON     */
  165. ms_f_verify(YES);
  166. break;
  167.     case NO: /* Turn Flag OFF     */
  168. ms_f_verify(NO);
  169. break;
  170.     default:
  171. if(*deblank(cmd)) /* Display an error message */
  172.     printf(MSG_ONOFF); /* for a non blank commnad  */
  173. else
  174.          printf(MSG_VERIFY, ms_f_getverify() ? MSG_ON : MSG_OFF);
  175. break;
  176. }
  177. }
  178. #endif
  179. #if defined(DOSPLUS)
  180. /*
  181.  * CHCP [CodePage]
  182.  *
  183.  * CHCP displays or changes the current global codepage
  184.  *
  185.  */
  186. GLOBAL VOID CDECL cmd_chcp(cmd)
  187. REG BYTE    *cmd;
  188. {
  189. UWORD systemcp, globalcp;
  190. WORD ret;
  191. zap_spaces(cmd);
  192. if(*cmd) {
  193.     if(check_num(cmd, 0, 999, &globalcp))
  194. printf(INV_NUM);
  195.     else {
  196. if((ret = ms_x_setcp(globalcp)) < 0)
  197.     if (ret == ED_FILE)
  198.         printf (MSG_CPNF);
  199.     else
  200.         printf(MSG_BADCP, globalcp);
  201.     }
  202. }
  203. else {
  204.     ms_x_getcp(&globalcp, &systemcp);
  205.     printf(MSG_CURCP, globalcp);
  206. }
  207. }
  208. /*
  209.  * CTTY Device Name
  210.  *
  211.  * CTTY redirects all console output to the specified character
  212.  * device. Note CTTY will only allow a DEVICE to be specified.
  213.  *
  214.  */
  215. GLOBAL VOID CDECL cmd_ctty(cmd)
  216. REG BYTE    *cmd;
  217. {
  218. BYTE device[MAX_FILELEN];
  219. WORD h, j;
  220. get_filename(device, deblank(cmd), NO); /* Extract the Device Name */
  221. FOREVER {
  222.     if((h = ms_x_open(device, OPEN_RW)) < 0)
  223.         break;
  224.     j = ms_x_ioctl(h); /* Check the user specified a */
  225.     if((j & 0x0080) == 0) { /* device or not. If a file was */
  226. ms_x_close(h); /* Close the handle and quit */
  227. break;
  228.     }
  229.     
  230.     j |= 0x03;
  231.     ms_x_setdev(h,j);
  232.     ms_x_fdup(STDIN, h); /* Force duplicate this handle */
  233.     ms_x_fdup(STDOUT, h); /* onto STDIN, STDOUT and  */
  234.     ms_x_fdup(STDERR, h); /* STDERR. */
  235.     /*
  236.      * Update the internal variables which contain the handle
  237.      * table index to be updated with the new values. So that
  238.      * all the Command Processor error messages go to the right
  239.      * device.
  240.      */
  241.     in_handle = out_handle = psp_poke(h, 0xFF);
  242.     psp_poke(h, in_handle);
  243.     ms_x_close(h); /* Finally close the handle and */
  244.     return; /* return to the caller. */
  245. }
  246. crlfflg = YES; /* Display the Device Name */
  247. printf(MSG_NEEDDEV); /* required error message and */
  248. return; /* Terminate. */
  249. }
  250. /*#if 0 #NOIDLE#*/
  251. /*
  252.  * IDLE [ON|OFF]
  253.  */
  254. GLOBAL VOID CDECL cmd_idle(cmd)
  255. REG BYTE    *cmd;
  256. {
  257. IDLE_STATE FAR *idle;
  258. idle = ms_idle_ptr ();
  259. if (idle->flags & IDLE_ENABLE) {
  260.     printf(MSG_DISABLED); /* say if idle is installed */
  261.     return;
  262. }
  263. switch(onoff(cmd)) { /* Check for "=on/off"     */
  264.     case YES: /* Reset flag     */
  265. idle->flags &= ~IDLE_ON;
  266. break;
  267.     case NO: /* Set flag */
  268. idle->flags |= IDLE_ON;
  269. break;
  270.     default:
  271. if(*deblank(cmd)) /* Display an error message */
  272.     printf(MSG_ONOFF); /* for a non blank commnad  */
  273. else
  274.          printf(MSG_IDLE, idle->flags & IDLE_ON ? MSG_OFF : MSG_ON);
  275. break;
  276. }
  277. }
  278. /*#endif #NOIDLE#*/
  279. #endif
  280. #if defined(CDOSTMP) || defined(CDOS)
  281. /*
  282.  * Enforce the current PRINTER and AUX mapping for LPT1 and COM1.
  283.  * Using the console number and the number of devices supported
  284.  * update the correct mapping byte in the table.
  285.  */
  286. #define INT17_PTR 0x0C46 /* List Mapping Table */
  287. #define INT14_PTR 0x0C48 /* Aux Mapping Table */
  288. MLOCAL VOID map_device(tbl, dev)
  289. UWORD tbl;
  290. UWORD dev;
  291. {
  292. UBYTE console;
  293. tbl = *SYSDATW(tbl);
  294. console = (UBYTE) bdos(C_GET, 0);
  295. *SYSDATB(tbl + (*SYSDATB(tbl) * console) +1) = (BYTE) dev;
  296. }
  297. GLOBAL VOID CDECL cmd_stop(cmd)
  298. REG BYTE    *cmd;
  299. {
  300. UWORD vc_base, vc_num, pc_num, i;
  301. struct {
  302. UWORD pd; /* PD address */
  303. UWORD term; /* Process termination Code */
  304. UWORD cns; /* Console Number and Zero field*/
  305. BYTE name[8]; /* Process Name  */
  306. } apb;
  307. cmd = deblank(cmd); /* Get the Process Name ABORT */
  308. if(!*cmd) { /* If no command line options */
  309.     printf(MSG_BADSTOP); /* return with syntax error */
  310.     return; /* disk based version of STOP. */
  311. }
  312. memset(apb.name, ' ', 8); /* Blank fill the Name Buffer */
  313. for(i=0; i < 8 && is_filechar(cmd); cmd++, i++)
  314.     apb.name[i] = toupper(*cmd);
  315. if(i == 0) { /* If no valid process name was */
  316.     printf(MSG_BADSTOP); /* given then return with a */
  317.     return; /* syntax error. */
  318. }     
  319. vc_data(&vc_base, &vc_num, &pc_num);
  320. if(check_num(cmd, 1, vc_num, &apb.cns)) {
  321.     printf(MSG_BADSTOP);
  322.     return;
  323. }
  324.     
  325. apb.pd = 0; /* Zero Process Descriptor Field */
  326. apb.term = 0; /* Only Abort User Process's     */
  327. apb.cns += vc_base - 1; /* Force console number base 0  */
  328. if(bdos(P_ABORT, &apb))  /* Abort the Process  */
  329.     printf(MSG_BADSTOP);
  330. }
  331. /*
  332.  * BANK [ON|OFF]
  333.  */
  334. GLOBAL VOID CDECL cmd_bank(cmd)
  335. REG BYTE    *cmd;
  336. {
  337. setflag(cmd, MSG_BANK, (UWORD FAR *) &pd->P_PCMFLAG, PIDF_BANK);
  338. }
  339. /*
  340.  * SUSPEND [ON|OFF]
  341.  */
  342. GLOBAL VOID CDECL cmd_suspend(cmd)
  343. REG BYTE    *cmd;
  344. {
  345. setflag(cmd, MSG_SUSPEND, (UWORD FAR *) &pd->P_PCMFLAG, PIDF_SUSPEND);
  346. }
  347. /*
  348.  * IDLE [ON|OFF]
  349.  */
  350. GLOBAL VOID CDECL cmd_idle(cmd)
  351. REG BYTE    *cmd;
  352. {
  353. setflag(cmd, MSG_IDLE, (UWORD FAR *) &pd->P_PCMFLAG, PIDF_IDLE);
  354. }
  355. /*
  356.  * MEMSIZE [Memory Size (Kb)]
  357.  */
  358. GLOBAL VOID CDECL cmd_memsize(cmd)
  359. REG BYTE    *cmd;
  360. {
  361. UWORD  kb, mmp; /* number in kilobytes */
  362. mmp = *SYSDATW(MMP)/64; /* Per Process Maximum in Kb */
  363. kb = (pd->P_PCMMEM + 0x0A)/64; /* Convert to number of Kb */
  364. zap_spaces(cmd);
  365. if(*cmd) {
  366.     if(check_num(cmd, 0, MAX_MEMSIZE, &kb))
  367. printf (INV_NUM);
  368.     else {
  369.         if(kb == 0 || kb > mmp) /* If MEMSIZE specified was */
  370.     kb = mmp; /* out of range or was Zero */
  371. pd->P_PCMMEM = kb * 64 - 0x0A; /* then use the MMP     */
  372.     }
  373. }
  374. else
  375.     printf (MSG_MEMSIZE, kb);      
  376. }
  377. /*
  378.  * LIMSIZE [Memory Size (Kb)]
  379.  *
  380.  * This command sets the Maximum number of blocks to be allocated
  381.  * to a process using the LIM memory. The maximum field is fixed for
  382.  * Concurrent DOS XM to MAX_LIMSIZE but for Concurrent DOS 386 the
  383.  * LIMMAX field in the 386 data area is used.
  384.  */
  385. GLOBAL VOID CDECL cmd_limsize(cmd)
  386. REG BYTE    *cmd;
  387. {
  388. UWORD  kb, limmax; /* number in kilobytes */
  389. kb = pd->P_LIMMEM * 16; /* get number of kilobytes */
  390. if(*SYSDATW(V386_PTR)) { /* If this is Concurrent DOS 386 */
  391.             if (*SYSDATW(*SYSDATW(V386_PTR) + 15)!=0xff) {
  392.         printf (MSG_LIMOFF);
  393.                 return;
  394.             }
  395.             else
  396.                 limmax = *SYSDATW(*SYSDATW(V386_PTR) + 18) * 16;
  397.         }        
  398. else
  399.     limmax = MAX_LIMSIZE;
  400. zap_spaces(cmd);
  401. if(*cmd) {
  402.     if(check_num(cmd, 0, limmax, &kb))
  403. printf (INV_NUM);
  404.     else 
  405. pd->P_LIMMEM = (kb+15)/16;
  406. }
  407. else
  408.     printf (MSG_LIMSIZE, kb);      
  409. }
  410. /*
  411.  * NETDRIVE d: [/A|/R|/L]
  412.  *
  413.  * This command displays and modifies the current "network" status 
  414.  * of all physical drives currently logged in.
  415.  *
  416.  * NETDRIVE d: /R Treat as Networked Media
  417.  * NETDRIVE d: /L Treat as Local Media
  418.  * NETDRIVE [d:|/A] Display Network Status
  419.  */
  420. #define NETDRIVE_ALL (flags == 1) /* Display ALL */
  421. #define NETDRIVE_LOCAL (flags & 2) /* Treat as LOCAL media */
  422. #define NETDRIVE_REMOTE (flags & 4) /* Treat as REMOTE media*/
  423. #define CCBLIST 0x0c3e
  424. #define CCB_NETVEC 0x0010
  425. GLOBAL VOID CDECL cmd_netdrive(s)
  426. REG BYTE    *s;
  427. {
  428. BYTE *cp;
  429. UWORD login, network; /* Login Vector  */
  430. WORD    ret; /* General purpose variable */
  431. UWORD flags; /* Command Flags */
  432. UWORD ccbptr; /* address of CCB */
  433. UWORD netvec; /* address pseudo-net drive vec */
  434. /* We bodge flags to all "/Local" and "/Remote" by making "emotc" */
  435. /* into flags as well - we are only interested in the "alr" flags */
  436. f_check (s, "alremotc", &flags, YES);
  437. s = deblank(s);     /* Deblank after the Flag Check */
  438. ccbptr = *SYSDATW(CCBLIST) + 2*pd->P_CNS;
  439. netvec = *SYSDATW(ccbptr) + CCB_NETVEC;
  440. login = network = (UWORD) network_drvs();
  441. login |= (UWORD) physical_drvs(); /* Physical Drive Vector */
  442. network |= *SYSDATW(netvec);   /* Logically Remote Drives */
  443. /*
  444.  * if NETDRIVE_ALL then display the network status of all the currently
  445.  * logged in physical drives.
  446.  */
  447. if(NETDRIVE_ALL || !*s) {
  448.     for(ret = 0; ret < 16; ret++, login >>= 1, network >>=1)
  449. if(login & 1L) {
  450.     printf("Netdrive %c: %sn", ret + 'A',
  451.             network & 1 ? MSG_REMOTE : MSG_LOCAL);
  452. }
  453.     return;
  454. }
  455. if(nofiles(s, ATTR_ALL, NO, NO))/* Abort if an illegal drive is   */
  456.     return;  /* selected.   */
  457. login &= ~((UWORD) network_drvs()); /* Invalidate Remote Drives   */
  458. ret = 1 << ddrive; /* Generate Bit vector and then   */
  459. if((login & ret) == 0) { /* check that this is a logged in */
  460.     e_check(ED_DRIVE); /* physical drive   */
  461.     return;
  462. }
  463. if(NETDRIVE_LOCAL) {
  464.     *SYSDATW(netvec) &= ~ret; /* Local Drive   */
  465. }
  466. else if(NETDRIVE_REMOTE) {
  467.     *SYSDATW(netvec) |= ret; /* Remote Drive   */
  468. }
  469. else {
  470.     printf("Netdrive %c: %sn",  ddrive + 'A',
  471.      network & ret ? MSG_REMOTE : MSG_LOCAL);
  472. }
  473. }
  474. #endif
  475. #if !defined(FINAL) && !defined(DOSPLUS)
  476. /*
  477.  * DBG [ON|OFF]
  478.  */
  479. GLOBAL VOID CDECL cmd_dbg(cmd)
  480. REG BYTE    *cmd;
  481. {
  482. setflag(cmd, MSG_DEBUG, (UWORD FAR *) &pd->P_SFLAG, PSF_DEBUG);
  483. }
  484. #endif
  485. #if defined(CPM)
  486. /*.pa*/
  487. /*
  488.  *
  489.  */
  490. EXTERN UWORD user; /* Current User area */
  491. GLOBAL VOID CDECL cmd_user(s)
  492. REG BYTE *s;
  493. {
  494.         if(*s && check_num(s, 0, 15, &user))    /* If command line and its not */
  495.             printf(INV_USER);                   /* a valid user area then invalid user */
  496.         printf(CUR_USER, user); 
  497. }
  498. #endif