apps.c revision 55714
1/* apps/apps.c */ 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 3 * All rights reserved. 4 * 5 * This package is an SSL implementation written 6 * by Eric Young (eay@cryptsoft.com). 7 * The implementation was written so as to conform with Netscapes SSL. 8 * 9 * This library is free for commercial and non-commercial use as long as 10 * the following conditions are aheared to. The following conditions 11 * apply to all code found in this distribution, be it the RC4, RSA, 12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation 13 * included with this distribution is covered by the same copyright terms 14 * except that the holder is Tim Hudson (tjh@cryptsoft.com). 15 * 16 * Copyright remains Eric Young's, and as such any Copyright notices in 17 * the code are not to be removed. 18 * If this package is used in a product, Eric Young should be given attribution 19 * as the author of the parts of the library used. 20 * This can be in the form of a textual message at program startup or 21 * in documentation (online or textual) provided with the package. 22 * 23 * Redistribution and use in source and binary forms, with or without 24 * modification, are permitted provided that the following conditions 25 * are met: 26 * 1. Redistributions of source code must retain the copyright 27 * notice, this list of conditions and the following disclaimer. 28 * 2. Redistributions in binary form must reproduce the above copyright 29 * notice, this list of conditions and the following disclaimer in the 30 * documentation and/or other materials provided with the distribution. 31 * 3. All advertising materials mentioning features or use of this software 32 * must display the following acknowledgement: 33 * "This product includes cryptographic software written by 34 * Eric Young (eay@cryptsoft.com)" 35 * The word 'cryptographic' can be left out if the rouines from the library 36 * being used are not cryptographic related :-). 37 * 4. If you include any Windows specific code (or a derivative thereof) from 38 * the apps directory (application code) you must include an acknowledgement: 39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 40 * 41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 51 * SUCH DAMAGE. 52 * 53 * The licence and distribution terms for any publically available version or 54 * derivative of this code cannot be changed. i.e. this code cannot simply be 55 * copied and put under another distribution licence 56 * [including the GNU Public Licence.] 57 */ 58 59#include <stdio.h> 60#include <stdlib.h> 61#include <string.h> 62#include <sys/types.h> 63#include <sys/stat.h> 64#define NON_MAIN 65#include "apps.h" 66#undef NON_MAIN 67 68#ifdef WINDOWS 69# include "bss_file.c" 70#endif 71 72int app_init(long mesgwin); 73#ifdef undef /* never finished - probably never will be :-) */ 74int args_from_file(char *file, int *argc, char **argv[]) 75 { 76 FILE *fp; 77 int num,i; 78 unsigned int len; 79 static char *buf=NULL; 80 static char **arg=NULL; 81 char *p; 82 struct stat stbuf; 83 84 if (stat(file,&stbuf) < 0) return(0); 85 86 fp=fopen(file,"r"); 87 if (fp == NULL) 88 return(0); 89 90 *argc=0; 91 *argv=NULL; 92 93 len=(unsigned int)stbuf.st_size; 94 if (buf != NULL) Free(buf); 95 buf=(char *)Malloc(len+1); 96 if (buf == NULL) return(0); 97 98 len=fread(buf,1,len,fp); 99 if (len <= 1) return(0); 100 buf[len]='\0'; 101 102 i=0; 103 for (p=buf; *p; p++) 104 if (*p == '\n') i++; 105 if (arg != NULL) Free(arg); 106 arg=(char **)Malloc(sizeof(char *)*(i*2)); 107 108 *argv=arg; 109 num=0; 110 p=buf; 111 for (;;) 112 { 113 if (!*p) break; 114 if (*p == '#') /* comment line */ 115 { 116 while (*p && (*p != '\n')) p++; 117 continue; 118 } 119 /* else we have a line */ 120 *(arg++)=p; 121 num++; 122 while (*p && ((*p != ' ') && (*p != '\t') && (*p != '\n'))) 123 p++; 124 if (!*p) break; 125 if (*p == '\n') 126 { 127 *(p++)='\0'; 128 continue; 129 } 130 /* else it is a tab or space */ 131 p++; 132 while (*p && ((*p == ' ') || (*p == '\t') || (*p == '\n'))) 133 p++; 134 if (!*p) break; 135 if (*p == '\n') 136 { 137 p++; 138 continue; 139 } 140 *(arg++)=p++; 141 num++; 142 while (*p && (*p != '\n')) p++; 143 if (!*p) break; 144 /* else *p == '\n' */ 145 *(p++)='\0'; 146 } 147 *argc=num; 148 return(1); 149 } 150#endif 151 152int str2fmt(char *s) 153 { 154 if ((*s == 'D') || (*s == 'd')) 155 return(FORMAT_ASN1); 156 else if ((*s == 'T') || (*s == 't')) 157 return(FORMAT_TEXT); 158 else if ((*s == 'P') || (*s == 'p')) 159 return(FORMAT_PEM); 160 else if ((*s == 'N') || (*s == 'n')) 161 return(FORMAT_NETSCAPE); 162 else 163 return(FORMAT_UNDEF); 164 } 165 166#if defined(MSDOS) || defined(WIN32) || defined(WIN16) 167void program_name(char *in, char *out, int size) 168 { 169 int i,n; 170 char *p=NULL; 171 172 n=strlen(in); 173 /* find the last '/', '\' or ':' */ 174 for (i=n-1; i>0; i--) 175 { 176 if ((in[i] == '/') || (in[i] == '\\') || (in[i] == ':')) 177 { 178 p= &(in[i+1]); 179 break; 180 } 181 } 182 if (p == NULL) 183 p=in; 184 n=strlen(p); 185 /* strip off trailing .exe if present. */ 186 if ((n > 4) && (p[n-4] == '.') && 187 ((p[n-3] == 'e') || (p[n-3] == 'E')) && 188 ((p[n-2] == 'x') || (p[n-2] == 'X')) && 189 ((p[n-1] == 'e') || (p[n-1] == 'E'))) 190 n-=4; 191 if (n > size-1) 192 n=size-1; 193 194 for (i=0; i<n; i++) 195 { 196 if ((p[i] >= 'A') && (p[i] <= 'Z')) 197 out[i]=p[i]-'A'+'a'; 198 else 199 out[i]=p[i]; 200 } 201 out[n]='\0'; 202 } 203#else 204#ifdef VMS 205void program_name(char *in, char *out, int size) 206 { 207 char *p=in, *q; 208 char *chars=":]>"; 209 210 while(*chars != '\0') 211 { 212 q=strrchr(p,*chars); 213 if (q > p) 214 p = q + 1; 215 chars++; 216 } 217 218 q=strrchr(p,'.'); 219 if (q == NULL) 220 q = in+size; 221 strncpy(out,p,q-p); 222 out[q-p]='\0'; 223 } 224#else 225void program_name(char *in, char *out, int size) 226 { 227 char *p; 228 229 p=strrchr(in,'/'); 230 if (p != NULL) 231 p++; 232 else 233 p=in; 234 strncpy(out,p,size-1); 235 out[size-1]='\0'; 236 } 237#endif 238#endif 239 240#ifdef WIN32 241int WIN32_rename(char *from, char *to) 242 { 243#ifdef WINNT 244 int ret; 245/* Note: MoveFileEx() doesn't work under Win95, Win98 */ 246 247 ret=MoveFileEx(from,to,MOVEFILE_REPLACE_EXISTING|MOVEFILE_COPY_ALLOWED); 248 return(ret?0:-1); 249#else 250 unlink(to); 251 return MoveFile(from, to); 252#endif 253 } 254#endif 255 256int chopup_args(ARGS *arg, char *buf, int *argc, char **argv[]) 257 { 258 int num,len,i; 259 char *p; 260 261 *argc=0; 262 *argv=NULL; 263 264 len=strlen(buf); 265 i=0; 266 if (arg->count == 0) 267 { 268 arg->count=20; 269 arg->data=(char **)Malloc(sizeof(char *)*arg->count); 270 } 271 for (i=0; i<arg->count; i++) 272 arg->data[i]=NULL; 273 274 num=0; 275 p=buf; 276 for (;;) 277 { 278 /* first scan over white space */ 279 if (!*p) break; 280 while (*p && ((*p == ' ') || (*p == '\t') || (*p == '\n'))) 281 p++; 282 if (!*p) break; 283 284 /* The start of something good :-) */ 285 if (num >= arg->count) 286 { 287 arg->count+=20; 288 arg->data=(char **)Realloc(arg->data, 289 sizeof(char *)*arg->count); 290 if (argc == 0) return(0); 291 } 292 arg->data[num++]=p; 293 294 /* now look for the end of this */ 295 if ((*p == '\'') || (*p == '\"')) /* scan for closing quote */ 296 { 297 i= *(p++); 298 arg->data[num-1]++; /* jump over quote */ 299 while (*p && (*p != i)) 300 p++; 301 *p='\0'; 302 } 303 else 304 { 305 while (*p && ((*p != ' ') && 306 (*p != '\t') && (*p != '\n'))) 307 p++; 308 309 if (*p == '\0') 310 p--; 311 else 312 *p='\0'; 313 } 314 p++; 315 } 316 *argc=num; 317 *argv=arg->data; 318 return(1); 319 } 320 321#ifndef APP_INIT 322int app_init(long mesgwin) 323 { 324 return(1); 325 } 326#endif 327