Subversion Repositories SvarDOS

Rev

Rev 225 | Rev 236 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 225 Rev 226
1
/*
1
/*
2
 * FDINST - lightweigth FreeDOS package installer
2
 * FDINST - lightweigth FreeDOS package installer
3
 * Copyright (C) 2015-2017 Mateusz Viste
3
 * Copyright (C) 2015-2017 Mateusz Viste
4
 *
4
 *
5
 * Permission is hereby granted, free of charge, to any person obtaining a
5
 * Permission is hereby granted, free of charge, to any person obtaining a
6
 * copy of this software and associated documentation files (the "Software"),
6
 * copy of this software and associated documentation files (the "Software"),
7
 * to deal in the Software without restriction, including without limitation
7
 * to deal in the Software without restriction, including without limitation
8
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9
 * and/or sell copies of the Software, and to permit persons to whom the
9
 * and/or sell copies of the Software, and to permit persons to whom the
10
 * Software is furnished to do so, subject to the following conditions:
10
 * Software is furnished to do so, subject to the following conditions:
11
 *
11
 *
12
 * The above copyright notice and this permission notice shall be included in
12
 * The above copyright notice and this permission notice shall be included in
13
 * all copies or substantial portions of the Software.
13
 * all copies or substantial portions of the Software.
14
 *
14
 *
15
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
20
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21
 * IN THE SOFTWARE.
21
 * IN THE SOFTWARE.
22
 */
22
 */
23
 
23
 
24
 
24
 
25
#include <stdio.h>    /* printf() */
25
#include <stdio.h>    /* printf() */
26
#include <stdlib.h>   /* malloc() and friends */
26
#include <stdlib.h>   /* malloc() and friends */
27
#include <string.h>   /* strcasecmp() */
27
#include <string.h>   /* strcasecmp() */
28
 
28
 
29
#include "libunzip.h"
29
#include "libunzip.h"
30
#include "pkginst.h"
30
#include "pkginst.h"
31
#include "pkgrem.h"
31
#include "pkgrem.h"
32
#include "readenv.h"
32
#include "readenv.h"
33
#include "version.h"
33
#include "version.h"
34
 
34
 
35
 
35
 
36
enum ACTIONTYPES {
36
enum ACTIONTYPES {
37
  ACTION_INSTALL,
37
  ACTION_INSTALL,
38
  ACTION_REMOVE,
38
  ACTION_REMOVE,
39
  ACTION_HELP
39
  ACTION_HELP
40
};
40
};
41
 
41
 
42
 
42
 
43
static int showhelp(void) {
43
static int showhelp(void) {
44
  printf("FDINST v" PVER " Copyright (C) " PDATE " Mateusz Viste\n"
44
  printf("FDINST v" PVER " Copyright (C) " PDATE " Mateusz Viste\n"
45
         "\n"
45
         "\n"
46
         "FDINST is a lightweigth package installer for FreeDOS. It is an alternative\n"
46
         "FDINST is a lightweigth package installer for FreeDOS. It is an alternative\n"
47
         "to FDNPKG, when only basic, local install/remove actions are necessary. FDINST\n"
47
         "to FDNPKG, when only basic, local install/remove actions are necessary. FDINST\n"
48
         "is a 16-bit, 8086-compatible application running in real mode.\n"
48
         "is a 16-bit, 8086-compatible application running in real mode.\n"
49
         "\n"
49
         "\n"
50
         "Usage: FDINST install package.zip\n"
50
         "Usage: FDINST install package.zip\n"
51
         "       FDINST remove package\n"
51
         "       FDINST remove package\n"
52
         "\n"
52
         "\n"
53
         "FDINST is published under the MIT license, and shares most of its source code\n"
53
         "FDINST is published under the MIT license, and shares most of its source code\n"
54
         "with FDNPKG to guarantee consistent behaviour of both tools. It also uses\n"
54
         "with FDNPKG to guarantee consistent behaviour of both tools. It also uses\n"
55
         "FDNPKG's configuration file.\n"
55
         "FDNPKG's configuration file.\n"
56
         );
56
         );
57
  return(1);
57
  return(1);
58
}
58
}
59
 
59
 
60
 
60
 
61
static enum ACTIONTYPES parsearg(int argc, char **argv) {
61
static enum ACTIONTYPES parsearg(int argc, char **argv) {
62
  int extpos, i;
-
 
63
  enum ACTIONTYPES res = ACTION_HELP;
-
 
64
  /* I expect exactly 2 arguments (ie argc == 3) */
62
  /* I expect exactly 2 arguments (ie argc == 3) */
65
  if (argc != 3) return(ACTION_HELP);
63
  if (argc != 3) return(ACTION_HELP);
-
 
64
 
66
  /* look for valid actions */
65
  /* look for valid actions */
67
  if (strcasecmp(argv[1], "install") == 0) {
66
  if (strcasecmp(argv[1], "install") == 0) {
68
    res = ACTION_INSTALL;
67
    return(ACTION_INSTALL);
69
  } else if (strcasecmp(argv[1], "remove") == 0) {
68
  } else if (strcasecmp(argv[1], "remove") == 0) {
70
    res = ACTION_REMOVE;
69
    return(ACTION_REMOVE);
-
 
70
  } else {
-
 
71
    return(ACTION_HELP);
71
  }
72
  }
72
  /* the argument should never be empty */
-
 
73
  if (argv[2][0] == 0) return(ACTION_INSTALL);
-
 
74
  /* for 'install', validate that the extension is '.zip' */
-
 
75
  if (res == ACTION_INSTALL) {
-
 
76
    /* find where the file's extension starts */
-
 
77
    extpos = 0;
-
 
78
    for (i = 0; argv[2][i] != 0; i++) {
-
 
79
      if (argv[2][i] == '.') extpos = i + 1;
-
 
80
    }
-
 
81
    if (extpos == 0) return(ACTION_HELP);
-
 
82
  }
-
 
83
  /* return the result */
-
 
84
  return(res);
-
 
85
}
73
}
86
 
74
 
87
 
75
 
88
static int pkginst(char *file, int flags, char *dosdir, char *tempdir, struct customdirs *dirlist) {
76
static int pkginst(char *file, int flags, char *dosdir, char *tempdir, struct customdirs *dirlist) {
89
  char pkgname[32];
77
  char pkgname[32];
90
  int t, lastpathdelim = -1, u = 0;
78
  int t, lastpathdelim = -1, u = 0;
91
  char *buffmem1k;
79
  char *buffmem1k;
92
  struct ziplist *zipfileidx;
80
  struct ziplist *zipfileidx;
93
  FILE *zipfilefd;
81
  FILE *zipfilefd;
94
  for (t = 0; file[t] != 0; t++) {
82
  for (t = 0; file[t] != 0; t++) {
95
    if ((file[t] == '/') || (file[t] == '\\')) lastpathdelim = t;
83
    if ((file[t] == '/') || (file[t] == '\\')) lastpathdelim = t;
96
  }
84
  }
97
  /* copy the filename into pkgname (without path elements) */
85
  /* copy the filename into pkgname (without path elements) */
98
  for (t = lastpathdelim + 1; file[t] != 0; t++) pkgname[u++] = file[t];
86
  for (t = lastpathdelim + 1; file[t] != 0; t++) pkgname[u++] = file[t];
99
  pkgname[u] = 0; /* terminate the string */
87
  pkgname[u] = 0; /* terminate the string */
100
  /* truncate the file's extension (.zip) */
88
  /* truncate the file's extension (.zip) */
101
  for (t = u; t > 0; t--) {
89
  for (t = u; t > 0; t--) {
102
    if (pkgname[t] == '.') {
90
    if (pkgname[t] == '.') {
103
      pkgname[t] = 0;
91
      pkgname[t] = 0;
104
      break;
92
      break;
105
    }
93
    }
106
  }
94
  }
107
  /* allocate some memory for pkginst_preparepackage() to do its job */
95
  /* allocate some memory for pkginst_preparepackage() to do its job */
108
  buffmem1k = malloc(1024);
96
  buffmem1k = malloc(1024);
109
  if (buffmem1k == NULL) {
97
  if (buffmem1k == NULL) {
110
    puts("ERROR: Out of memory");
98
    puts("ERROR: Out of memory");
111
    return(1);
99
    return(1);
112
  }
100
  }
113
  /* prepare the zip file and install it */
101
  /* prepare the zip file and install it */
114
  zipfileidx = pkginstall_preparepackage(pkgname, file, flags, &zipfilefd, dosdir, dirlist, buffmem1k);
102
  zipfileidx = pkginstall_preparepackage(pkgname, file, flags, &zipfilefd, dosdir, dirlist, buffmem1k);
115
  free(buffmem1k);
103
  free(buffmem1k);
116
  if (zipfileidx != NULL) {
104
  if (zipfileidx != NULL) {
117
    int res = 0;
105
    int res = 0;
118
    if (pkginstall_installpackage(pkgname, dosdir, dirlist, zipfileidx, zipfilefd) != 0) res = 1;
106
    if (pkginstall_installpackage(pkgname, dosdir, dirlist, zipfileidx, zipfilefd) != 0) res = 1;
119
    fclose(zipfilefd);
107
    fclose(zipfilefd);
120
    return(res);
108
    return(res);
121
  } else {
109
  } else {
122
    fclose(zipfilefd);
110
    fclose(zipfilefd);
123
    return(1);
111
    return(1);
124
  }
112
  }
125
}
113
}
126
 
114
 
127
 
115
 
128
int main(int argc, char **argv) {
116
int main(int argc, char **argv) {
129
  int res, flags;
117
  int res, flags;
130
  enum ACTIONTYPES action;
118
  enum ACTIONTYPES action;
131
  char *dosdir, *tempdir, *cfgfile;
119
  char *dosdir, *tempdir, *cfgfile;
132
  struct customdirs *dirlist;
120
  struct customdirs *dirlist;
133
 
121
 
134
  action = parsearg(argc, argv);
122
  action = parsearg(argc, argv);
135
  if (action == ACTION_HELP) return(showhelp());
123
  if (action == ACTION_HELP) return(showhelp());
136
 
124
 
137
  /* allocate some bits for cfg file's location */
125
  /* allocate some bits for cfg file's location */
138
  cfgfile = malloc(256);
126
  cfgfile = malloc(256);
139
  if (cfgfile == NULL) {
127
  if (cfgfile == NULL) {
140
    puts("ERROR: Out of memory");
128
    puts("ERROR: Out of memory");
141
    return(1);
129
    return(1);
142
  }
130
  }
143
 
131
 
144
  /* read all necessary environment variables */
132
  /* read all necessary environment variables */
145
  if (readenv(&dosdir, &tempdir, cfgfile, 256) != 0) {
133
  if (readenv(&dosdir, &tempdir, cfgfile, 256) != 0) {
146
    free(cfgfile);
134
    free(cfgfile);
147
    return(1);
135
    return(1);
148
  }
136
  }
149
 
137
 
150
  /* load configuration */
138
  /* load configuration */
151
  flags = 0;
139
  flags = 0;
152
  dirlist = NULL;
140
  dirlist = NULL;
153
  if (loadconf(cfgfile, &dirlist, &flags) < 0) return(5);
141
  if (loadconf(cfgfile, &dirlist, &flags) < 0) return(5);
154
 
142
 
155
  /* free the cfgfile buffer, I won't need the config file's location any more */
143
  /* free the cfgfile buffer, I won't need the config file's location any more */
156
  free(cfgfile);
144
  free(cfgfile);
157
  cfgfile = NULL;
145
  cfgfile = NULL;
158
 
146
 
159
  switch (action) {
147
  switch (action) {
160
    case ACTION_INSTALL:
148
    case ACTION_INSTALL:
161
      res = pkginst(argv[2], flags, dosdir, tempdir, dirlist);
149
      res = pkginst(argv[2], flags, dosdir, tempdir, dirlist);
162
      break;
150
      break;
163
    case ACTION_REMOVE:
151
    case ACTION_REMOVE:
164
      res = pkgrem(argv[2], dosdir);
152
      res = pkgrem(argv[2], dosdir);
165
      break;
153
      break;
166
    default:
154
    default:
167
      res = showhelp();
155
      res = showhelp();
168
      break;
156
      break;
169
  }
157
  }
170
 
158
 
171
  if (res != 0) return(1);
159
  if (res != 0) return(1);
172
  return(0);
160
  return(0);
173
}
161
}
174
 
162