File: grabfcom.c

package info (click to toggle)
dosemu-freedos 1%3A0.0.b9r5a%2Betch.1-0etch1
  • links: PTS
  • area: contrib
  • in suites: etch
  • size: 19,744 kB
  • ctags: 23,279
  • sloc: ansic: 143,864; asm: 20,397; makefile: 3,868; perl: 1,106; yacc: 690; sh: 553; pascal: 297; xml: 150; cpp: 67
file content (153 lines) | stat: -rw-r--r-- 3,834 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/*	$id$
	$Locker:  $	$Name:  $	$State: Exp $

 * Grab the filename of COMMAND.COM
 *
 *  If warn != 0, warnings can be issued; otherwise this functions
 *  is silent.

	This file bases on INIT.C of FreeCOM v0.81 beta 1.

	0 -> is valid
	1 -> no such file
	2 -> is a device
	3 -> not valid
	4 -> out of memory / syntax error ... .

	$Log: grabfcom.c,v $
	Revision 1.3  2003/12/09 20:25:34  skaus
	bugfix: INIT: FreeCOM-path and TTY can be in any order
	
	Revision 1.2  2002/11/05 19:29:21  skaus
	bugfix: FreeCOM should accept relative path as argv[0]
	
	Revision 1.1  2001/04/12 00:33:53  skaus
	chg: new structure
	chg: If DEBUG enabled, no available commands are displayed on startup
	fix: PTCHSIZE also patches min extra size to force to have this amount
	   of memory available on start
	bugfix: CALL doesn't reset options
	add: PTCHSIZE to patch heap size
	add: VSPAWN, /SWAP switch, .SWP resource handling
	bugfix: COMMAND.COM A:\
	bugfix: CALL: if swapOnExec == ERROR, no change of swapOnExec allowed
	add: command MEMORY
	bugfix: runExtension(): destroys command[-2]
	add: clean.bat
	add: localized CRITER strings
	chg: use LNG files for hard-coded strings (hangForEver(), init.c)
		via STRINGS.LIB
	add: DEL.C, COPY.C, CBREAK.C: STRINGS-based prompts
	add: fixstrs.c: prompts & symbolic keys
	add: fixstrs.c: backslash escape sequences
	add: version IDs to DEFAULT.LNG and validation to FIXSTRS.C
	chg: splitted code apart into LIB\*.c and CMD\*.c
	bugfix: IF is now using error system & STRINGS to report errors
	add: CALL: /N
	
 */

#include "../config.h"

#include <assert.h>
#include <dos.h>
#include <limits.h>
#include <stdlib.h>
#include <string.h>

#include <dfn.h>

#include "../include/command.h"
#include "../err_fcts.h"
#include "../include/misc.h"

int grabComFilename(const int warn, const char far * const fnam)
{
  char *buf;
  size_t len;
  int rc;

  assert(fnam);

  /* Copy the filename into the local heap */
  len = _fstrlen(fnam);
  if(len >= INT_MAX || len < 1) {
    /* no filename specified */
    if(warn)
      error_syntax(0);
    return 4;
  }

  if((buf = malloc(len + 1)) == 0) {
    if(warn) error_out_of_memory();
    return 4;
  }
  _fmemcpy((char far*)buf, fnam, len);
  buf[len] = '\0';

    if (buf[1] != ':' || buf[2] != '\\')
    { char *p;

        /* expand the string for the user */
      p = dfnexpand(buf, 0);
      free(buf);
      if((buf = p) == 0) {
		  if(warn) error_out_of_memory();
		  return 4;
      }
      if(warn)
          error_init_fully_qualified(buf);

    	len = strlen(buf);
    }

    while(buf[len - 1] == '\\')
    	--len;
    buf[len] = 0;

    if(dfnstat(buf) & DFN_DIRECTORY) {
      /* The user specified a directory, try if we can find the
        COMMAND.COM with the standard name in there */
      char *p;

      if((p = realloc(buf, len + sizeof(COM_NAME) + 1)) == 0) {
        if(warn) error_out_of_memory();
        free(buf);
        return 4;
      }
      buf = p;
      strcpy(&buf[len], "\\" COM_NAME);
    }


	if(0 != (rc = validResFile(buf))) {
		if(warn) switch(rc) {
		default:
	#ifdef NDEBUG
			assert(0);
	#endif
		case 1: error_open_file(buf); break;
		case 2: error_fcom_is_device(buf); break;
		case 3: error_fcom_invalid(buf); break;
		}

		free(buf);
		return rc;
	}

  free(ComPath);    /* Save the found file */
  ComPath = buf;
	dprintf(("[INIT: new resource file name: %s]\n", ComPath));

  isSwapFile = 0;
  buf = dfnfilename(ComPath);
  assert(buf);
  if((buf = strchr(buf, '.')) != 0
   && stricmp(buf, ".swp") == 0) {
       dprintf(("[INIT: VSpawn file found: %s]\n", ComPath));
       memcpy(++buf, "COM", 3);
       isSwapFile = buf - ComPath;
  }

  return 0;
}