Urlader
view release on metacpan or search on metacpan
if (u_valid (h))
{
u_handle oh = pack_handle;
pack_unmap ();
pack_handle = h;
if (pack_map ()
&& strcmp (exe_id , PACK_NAME) == 0
&& strcmp (exe_ver, PACK_DATA) <= 0)
u_setenv ("URLADER_OVERRIDE", "override");
else
{
pack_unmap ();
pack_handle = oh;
oh = h;
pack_map ();
}
u_close (oh);
}
strcpy (exe_ver, PACK_DATA);
u_set_exe_info ();
pack_next ();
for (;;)
{
if (pack_cur->type == T_ENV)
u_setenv (PACK_NAME, PACK_DATA);
else if (pack_cur->type == T_ARG)
add_arg (PACK_NAME, u_16 (pack_cur->namelen) + 1);
else
break;
pack_next ();
}
done_env_arg:
if (u_rename (tmppath, execdir))
deltree (tmppath); // if move fails, delete new, assume other process created it independently
}
pack_unmap ();
u_close (pack_handle);
if (u_chdir (execdir))
u_fatal ("unable to change to application instance directory");
u_setenv ("URLADER_VERSION", URLADER_VERSION);
#if 0
// yes, this is overkill
u_setenv ("SHLIB_PATH" , execdir); // hpux
u_setenv ("LIBPATH" , execdir); // aix
u_setenv ("LD_LIBRARY_PATH" , execdir); // most elf systems
u_setenv ("LD_LIBRARY_PATH_32", execdir); // solaris
u_setenv ("LD_LIBRARY_PATH_64", execdir); // solaris
u_setenv ("LD_LIBRARYN32_PATH", execdir); // irix
u_setenv ("LD_LIBRARY64_PATH" , execdir); // irix
u_setenv ("DYLD_LIBRARY_PATH" , execdir); // os sucks from apple
#endif
}
static void
execute (void)
{
char *null = 0;
u_dynbuf_append (&exe_argv, &null, sizeof (null));
systemv ((const char *const *)exe_argv.addr);
}
// this argc/argv is without argv [0]
static void
doit (int argc, char *argv[])
{
int i;
u_setenv ("URLADER_CURRDIR", currdir);
u_set_datadir ();
u_mkdir (datadir);
if (!pack_map ())
u_fatal ("unable to map pack file - executable corrupted?");
load ();
while (argc--)
}
#ifdef _WIN32
int APIENTRY
WinMain (HINSTANCE hI, HINSTANCE hP, LPSTR argv, int command_show)
{
if (!GetModuleFileName (hI, tmppath, sizeof (tmppath)))
u_fatal ("unable to find executable pack");
u_setenv ("URLADER_EXEPATH", tmppath);
pack_handle = u_open (tmppath);
if (!u_valid (pack_handle))
u_fatal ("unable to open executable pack");
if (!GetCurrentDirectory (sizeof (currdir), currdir))
strcpy (currdir, ".");
doit (1, &argv);
++p;
}
exe_path = tmppath;
}
pack_handle = u_open (exe_path);
if (!u_valid (pack_handle))
u_fatal ("unable to open executable for reading - permissions problem?");
u_setenv ("URLADER_EXEPATH", exe_path);
}
#if 0
/* intersperse hostname, for whatever reason */
if (gethostname (tmppath, sizeof (tmppath)))
strcpy (tmppath, "default");
u_append (datadir, tmppath);
#endif
#include <shlobj.h>
#include <shlwapi.h>
#include <wininet.h>
static DWORD dword;
#define u_handle HANDLE
#define u_invalid_handle 0
#define u_valid(handle) (!!handle)
#define u_setenv(name,value) SetEnvironmentVariable (name, value)
#define u_mkdir(path) !CreateDirectory (path, NULL)
#define u_chdir(path) !SetCurrentDirectory (path)
#define u_rename(fr,to) !MoveFile (fr, to)
#define u_open(path) CreateFile (path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL)
#define u_creat(path,exec) CreateFile (path, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL)
#define u_creat(path,exec) CreateFile (path, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL)
#define u_close(handle) CloseHandle (handle)
#define u_append(path,add) PathAppend (path, add)
#define u_write(handle,data,len) (WriteFile (handle, data, len, &dword, 0) ? dword : -1)
#ifdef PATH_MAX
#define MAX_PATH (PATH_MAX < 4096 ? 4096 : PATH_MAX)
#else
#define MAX_PATH 4096
#endif
#define u_handle int
#define u_invalid_handle -1
#define u_valid(fd) ((fd) >= 0)
#define u_setenv(name,value) setenv (name, value, 1)
#define u_mkdir(path) mkdir (path, 0777)
#define u_chdir(path) chdir (path)
#define u_rename(fr,to) rename (fr, to)
#define u_open(path) open (path, O_RDONLY)
#define u_creat(path,exec) open (path, O_WRONLY | O_CREAT | O_TRUNC, (exec) ? 0777 : 0666)
#define u_close(handle) close (handle)
#define u_append(path,add) strcat (strcat (path, "/"), add)
#define u_write(handle,data,len) write (handle, data, len)
// on a mostly idle system, a sync at the end is certainly faster, hope for the best
home = pw->pw_dir;
else
home = "/tmp";
}
u_mkdir (home);
//strcat (strcat (strcpy (datadir, home), "/."), URLADER);
sprintf (datadir, "%s/.%s", home, URLADER);
#endif
u_setenv ("URLADER_DATADIR", datadir);
}
static void
u_set_exe_info (void)
{
strcpy (exe_dir, datadir);
u_append (exe_dir, exe_id);
u_mkdir (exe_dir);
strcpy (execdir, exe_dir);
u_append (execdir, "i-");
strcat (execdir, exe_ver);
u_setenv ("URLADER_EXECDIR", execdir);
u_setenv ("URLADER_EXE_ID" , exe_id);
u_setenv ("URLADER_EXE_DIR", exe_dir);
u_setenv ("URLADER_EXE_VER", exe_ver);
}
/////////////////////////////////////////////////////////////////////////////
static u_handle
u_lock (const char *path, int excl, int dowait)
{
u_handle h;
h = u_lockfile (path);
( run in 0.453 second using v1.01-cache-2.11-cpan-a1d94b6210f )