ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Urlader/urlader.c
(Generate patch)

Comparing Urlader/urlader.c (file contents):
Revision 1.2 by root, Thu Dec 29 10:20:56 2011 UTC vs.
Revision 1.5 by root, Fri Dec 30 09:34:20 2011 UTC

1#ifndef URLADER 1#ifndef URLADER
2# define URLADER "urlader" 2# define URLADER "urlader"
3#endif 3#endif
4#define URLADER_VERSION "1.0" 4#define URLADER_VERSION "1.0" // a decimal number, not a version string
5 5
6#include <stdio.h> 6#include <stdio.h>
7#include <stdlib.h> 7#include <stdlib.h>
8#include <unistd.h> 8#include <unistd.h>
9#include <errno.h> 9#include <errno.h>
24 #include <wininet.h> 24 #include <wininet.h>
25 25
26 static DWORD dword; 26 static DWORD dword;
27 27
28 #define u_handle HANDLE 28 #define u_handle HANDLE
29 #define u_valid(handle) (!!handle)
30
29 #define u_setenv(name,value) SetEnvironmentVariable (name, value) 31 #define u_setenv(name,value) SetEnvironmentVariable (name, value)
30 #define u_mkdir(path) !CreateDirectory (path, NULL) 32 #define u_mkdir(path) !CreateDirectory (path, NULL)
31 #define u_chdir(path) !SetCurrentDirectory (path) 33 #define u_chdir(path) !SetCurrentDirectory (path)
32 #define u_rename(fr,to) !MoveFile (fr, to) 34 #define u_rename(fr,to) !MoveFile (fr, to)
33 #define u_open(path) CreateFile (path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL) 35 #define u_open(path) CreateFile (path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL)
34 #define u_creat(path,exec) CreateFile (path, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL) 36 #define u_creat(path,exec) CreateFile (path, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL)
35 #define u_close(handle) CloseHandle (handle) 37 #define u_close(handle) CloseHandle (handle)
36 #define u_append(path,add) PathAppend (path, add) 38 #define u_append(path,add) PathAppend (path, add)
37 #define u_write(handle,data,len) (WriteFile (handle, data, len, &dword, 0) ? dword : -1) 39 #define u_write(handle,data,len) (WriteFile (handle, data, len, &dword, 0) ? dword : -1)
38 40
41 #define u_fsync(handle) FlushFileBuffers (handle)
42 #define u_sync()
43
39#else 44#else
40 45
41 #include <sys/mman.h> 46 #include <sys/mman.h>
42 #include <sys/types.h> 47 #include <sys/types.h>
43 #include <pwd.h> 48 #include <pwd.h>
47 #else 52 #else
48 #define MAX_PATH 4096 53 #define MAX_PATH 4096
49 #endif 54 #endif
50 55
51 #define u_handle int 56 #define u_handle int
57 #define u_valid(fd) ((fd) >= 0)
58
52 #define u_setenv(name,value) setenv (name, value, 1) 59 #define u_setenv(name,value) setenv (name, value, 1)
53 #define u_mkdir(path) mkdir (path, 0777) 60 #define u_mkdir(path) mkdir (path, 0777)
54 #define u_chdir(path) chdir (path) 61 #define u_chdir(path) chdir (path)
55 #define u_rename(fr,to) rename (fr, to) 62 #define u_rename(fr,to) rename (fr, to)
56 #define u_open(path) open (path, O_RDONLY) + 1 63 #define u_open(path) open (path, O_RDONLY)
57 #define u_creat(path,exec) open (path, O_WRONLY | O_CREAT | O_TRUNC, (exec) ? 0777 : 0666) + 1 64 #define u_creat(path,exec) open (path, O_WRONLY | O_CREAT | O_TRUNC, (exec) ? 0777 : 0666)
58 #define u_close(handle) close (handle - 1) 65 #define u_close(handle) close (handle)
59 #define u_append(path,add) strcat (strcat (path, "/"), add) 66 #define u_append(path,add) strcat (strcat (path, "/"), add)
60 #define u_write(handle,data,len) write ((handle) - 1, data, len) 67 #define u_write(handle,data,len) write (handle, data, len)
68
69 // on a mostly idle system, a sync at the end is certainly faster, hope for the best
70 #define u_fsync(handle)
71 #define u_sync() sync ()
61 72
62#endif 73#endif
63 74
64#define u_16(ptr) (((ptr)[0] << 8) | (ptr)[1]) 75#define u_16(ptr) (((ptr)[0] << 8) | (ptr)[1])
65#define u_32(ptr) (((ptr)[0] << 24) | ((ptr)[1] << 16) | ((ptr)[2] << 8) | (ptr)[3]) 76#define u_32(ptr) (((ptr)[0] << 24) | ((ptr)[1] << 16) | ((ptr)[2] << 8) | (ptr)[3])
143 154
144enum 155enum
145{ 156{
146 T_NULL, // 5 157 T_NULL, // 5
147 T_META, // 1 : exe_id, exe_ver 158 T_META, // 1 : exe_id, exe_ver
148 T_ARG, // 2 : arg
149 T_ENV, // 3 : name, value 159 T_ENV, // 2 : name, value
160 T_ARG, // 3 : arg
150 T_DIR, // 4+: path 161 T_DIR, // 4+: path
151 T_FILE, // 4+: path, data 162 T_FILE, // 4+: path, data
152 T_NUM 163 T_NUM
153}; 164};
154 165
282 293
283 if (u_chdir (exe_dir)) 294 if (u_chdir (exe_dir))
284 fatal ("unable to change to application data directory"); 295 fatal ("unable to change to application data directory");
285 296
286 u_handle h = u_open ("override"); 297 u_handle h = u_open ("override");
287 if (h) 298 if (u_valid (h))
288 { 299 {
289 u_handle oh = pack_handle; 300 u_handle oh = pack_handle;
290 301
291 pack_handle = h; 302 pack_handle = h;
292 if (!pack_map ()) 303 if (!pack_map ())
302 fatal ("unable to locate override metadata"); 313 fatal ("unable to locate override metadata");
303 314
304 strcpy (exe_ver, PACK_DATA); 315 strcpy (exe_ver, PACK_DATA);
305 pack_next (); 316 pack_next ();
306 317
307 while (pack_cur->type == T_ARG) 318 for (;;)
308 { 319 {
320 if (pack_cur->type == T_ENV)
321 u_setenv (PACK_NAME, PACK_DATA);
322 else if (pack_cur->type == T_ARG)
309 exe_argv [exe_argc++] = strdup (PACK_NAME); 323 exe_argv [exe_argc++] = strdup (PACK_NAME);
324 else
325 break;
326
310 pack_next (); 327 pack_next ();
311 } 328 }
312 329
313 while (pack_cur->type == T_ENV) 330done_env_arg:
314 {
315 u_setenv (PACK_NAME, PACK_DATA);
316 pack_next ();
317 }
318
319 strcpy (execdir, exe_dir); 331 strcpy (execdir, exe_dir);
320 u_append (execdir, "i-"); 332 u_append (execdir, "i-");
321 strcat (execdir, exe_ver); 333 strcat (execdir, exe_ver);
322 334
323 if (access (execdir, F_OK)) 335 if (access (execdir, F_OK))
349 len = dlen; 361 len = dlen;
350 } 362 }
351 else 363 else
352 fatal ("unable to uncompress file data - pack corrupted?"); 364 fatal ("unable to uncompress file data - pack corrupted?");
353 365
354 if (!h) 366 if (!u_valid (h))
355 fatal ("unable to unpack file from packfile - disk full?"); 367 fatal ("unable to unpack file from packfile - disk full?");
356 368
357 if (u_write (h, data, len) != len) 369 if (u_write (h, data, len) != len)
358 fatal ("unable to unpack file from packfile - disk full?"); 370 fatal ("unable to unpack file from packfile - disk full?");
359 371
372 u_fsync (h);
360 u_close (h); 373 u_close (h);
361 } 374 }
362 break; 375 break;
363 376
364 case T_NULL: 377 case T_NULL:
369 } 382 }
370 383
371done: 384done:
372 if (u_chdir (datadir)) 385 if (u_chdir (datadir))
373 fatal ("unable to change to data directory"); 386 fatal ("unable to change to data directory");
387
388 u_sync ();
374 389
375 if (u_rename (tmppath, execdir)) 390 if (u_rename (tmppath, execdir))
376 deltree (tmppath); // if move fails, delete new, assume other process created it independently 391 deltree (tmppath); // if move fails, delete new, assume other process created it independently
377 } 392 }
378 393
387 u_setenv ("URLADER_EXECDIR", execdir); 402 u_setenv ("URLADER_EXECDIR", execdir);
388 u_setenv ("URLADER_EXE_ID" , exe_id); 403 u_setenv ("URLADER_EXE_ID" , exe_id);
389 u_setenv ("URLADER_EXE_DIR", exe_dir); 404 u_setenv ("URLADER_EXE_DIR", exe_dir);
390 u_setenv ("URLADER_EXE_VER", exe_ver); 405 u_setenv ("URLADER_EXE_VER", exe_ver);
391 406
407#if 0
392 // yes, this is overkill 408 // yes, this is overkill
393 u_setenv ("SHLIB_PATH" , execdir); // hpux 409 u_setenv ("SHLIB_PATH" , execdir); // hpux
394 u_setenv ("LIBPATH" , execdir); // aix 410 u_setenv ("LIBPATH" , execdir); // aix
395 u_setenv ("LD_LIBRARY_PATH" , execdir); // most elf systems 411 u_setenv ("LD_LIBRARY_PATH" , execdir); // most elf systems
396 u_setenv ("LD_LIBRARY_PATH_32", execdir); // solaris 412 u_setenv ("LD_LIBRARY_PATH_32", execdir); // solaris
397 u_setenv ("LD_LIBRARY_PATH_64", execdir); // solaris 413 u_setenv ("LD_LIBRARY_PATH_64", execdir); // solaris
398 u_setenv ("LD_LIBRARYN32_PATH", execdir); // irix 414 u_setenv ("LD_LIBRARYN32_PATH", execdir); // irix
399 u_setenv ("LD_LIBRARY64_PATH" , execdir); // irix 415 u_setenv ("LD_LIBRARY64_PATH" , execdir); // irix
400 u_setenv ("DYLD_LIBRARY_PATH" , execdir); // os sucks from apple 416 u_setenv ("DYLD_LIBRARY_PATH" , execdir); // os sucks from apple
417#endif
401} 418}
402 419
403static void 420static void
404execute (void) 421execute (void)
405{ 422{
413WinMain (HINSTANCE hI, HINSTANCE hP, LPSTR argv, int command_show) 430WinMain (HINSTANCE hI, HINSTANCE hP, LPSTR argv, int command_show)
414{ 431{
415 if (!GetModuleFileName (hI, tmppath, sizeof (tmppath))) 432 if (!GetModuleFileName (hI, tmppath, sizeof (tmppath)))
416 fatal ("unable to find executable pack"); 433 fatal ("unable to find executable pack");
417 434
418 if (!(pack_handle = u_open (tmppath))) 435 pack_handle = u_open (tmppath);
436 if (!u_valid (pack_handle))
419 fatal ("unable to open executable pack"); 437 fatal ("unable to open executable pack");
420 438
421 exe_info (); 439 exe_info ();
422 440
423 if (!GetCurrentDirectory (sizeof (currdir), currdir)) 441 if (!GetCurrentDirectory (sizeof (currdir), currdir))
440int 458int
441main (int argc, char *argv[]) 459main (int argc, char *argv[])
442{ 460{
443 char *home = getenv ("HOME"); 461 char *home = getenv ("HOME");
444 462
445 // we assume fd 0 and 2 are "normal"
446
447 if (!(pack_handle = u_open (argv [0]))) 463 pack_handle = u_open (argv [0]);
464 if (!u_valid (pack_handle))
448 fatal ("unable to open executable pack"); 465 fatal ("unable to open executable pack");
449 466
450 exe_info (); 467 exe_info ();
451 468
452 if (!home) 469 if (!home)
464 481
465 u_mkdir (home); 482 u_mkdir (home);
466 sprintf (datadir, "%s/.%s", home, URLADER); 483 sprintf (datadir, "%s/.%s", home, URLADER);
467 u_mkdir (datadir); 484 u_mkdir (datadir);
468 485
486#if 0
469 if (gethostname (tmppath, sizeof (tmppath))) 487 if (gethostname (tmppath, sizeof (tmppath)))
470 strcpy (tmppath, "default"); 488 strcpy (tmppath, "default");
471 489
472 u_append (datadir, tmppath); 490 u_append (datadir, tmppath);
491#endif
473 492
474 load (); 493 load ();
475 execute (); 494 execute ();
476 495
477 return 0; 496 return 0;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines