From 2c51b3e2b325630d24d8b2d748fa48c4ba050b9e Mon Sep 17 00:00:00 2001 From: SANO Masatoshi Date: Tue, 23 Sep 2014 02:12:23 +0900 Subject: [PATCH] start supporting win32 --- configure.ac | 4 +- src/cmds/pull/cmd.c | 14 +++---- src/cmds/pull/sbcl-bin.c | 80 ++++++++++++++++++++++++++++++++++++++-- src/cmds/pull/sbcl.c | 2 +- src/cmds/run/cmd.c | 34 +++++++++++++++-- src/util.c | 68 ++++++++++++++++++++++++---------- src/util.h | 6 +++ 7 files changed, 172 insertions(+), 36 deletions(-) diff --git a/configure.ac b/configure.ac index 7b7b63e..8b986a3 100644 --- a/configure.ac +++ b/configure.ac @@ -1,8 +1,8 @@ # -*- Autoconf -*- # Process this file with autoconf to produce a configure script. -AC_PREREQ([2.68]) -AC_INIT([lsp],[0.0.0.4],snmsts@gmail.com) +AC_PREREQ([2.65]) +AC_INIT([lsp],[0.0.0.5],snmsts@gmail.com) AM_CONFIG_HEADER(config.h) AC_CONFIG_FILES([Makefile src/Makefile]) diff --git a/src/cmds/pull/cmd.c b/src/cmds/pull/cmd.c index fac8858..38ce7b8 100644 --- a/src/cmds/pull/cmd.c +++ b/src/cmds/pull/cmd.c @@ -23,7 +23,7 @@ int installed_p(char* impl,char* version) impl=subseq(impl,0,pos); }else impl=q(impl); - i=s_cat(homedir(),q("impls/"),q(impl),q("-"),q(version),q("/"),NULL); + i=s_cat(homedir(),q("impls"),q(SLASH),q(impl),q("-"),q(version),q(SLASH),NULL); ret=directory_exist_p(i); s(i),s(impl); return ret; @@ -48,11 +48,11 @@ int start(char* impl,char* version) printf("It seems running installation process for $1/$2.\n"); return 0; } - p=cat(home,"tmp/",impl,"-",version,"/",NULL); + p=cat(home,"tmp",SLASH,impl,"-",version,SLASH,NULL); ensure_directories_exist(p); s(p); - p=cat(home,"tmp/",impl,"-",version,".lock",NULL); + p=cat(home,"tmp",SLASH,impl,"-",version,".lock",NULL); setup_signal_handler(p); touch(p); @@ -73,7 +73,7 @@ int download(char* impl,char* version) printf("Downloading archive.:%s\n",url); /*TBD proxy support... etc*/ if(url) { - impl_archive=cat(home,"archives/",impl,"-",version,".",(*(install_impl->extention))(impl,version),NULL); + impl_archive=cat(home,"archives",SLASH,impl,"-",version,".",(*(install_impl->extention))(impl,version),NULL); ensure_directories_exist(impl_archive); if(download_simple(url,impl_archive,0)) { @@ -105,7 +105,7 @@ int expand(char* impl,char* version) }else impl=q(impl); version=q(version); - dist_path=cat(home,"src/",impl,"-",version,"/",NULL); + dist_path=cat(home,"src",SLASH,impl,"-",version,SLASH,NULL); printf("Extracting archive. %s to %s\n",archive,dist_path); @@ -113,8 +113,8 @@ int expand(char* impl,char* version) ensure_directories_exist(dist_path); /* TBD log output */ - argv[1]=cat(home,"archives/",archive,NULL); - argv[3]=cat(home,"src/",NULL); + argv[1]=cat(home,"archives",SLASH,archive,NULL); + argv[3]=cat(home,"src",SLASH,NULL); cmd_tar(argc,argv); s(argv[1]),s(argv[3]); diff --git a/src/cmds/pull/sbcl-bin.c b/src/cmds/pull/sbcl-bin.c index da63577..79329ef 100644 --- a/src/cmds/pull/sbcl-bin.c +++ b/src/cmds/pull/sbcl-bin.c @@ -4,7 +4,6 @@ #include "pull.h" #include "opt.h" -extern char* sbcl_extention(char* impl,char* version); extern int sbcl_install(char* impl,char* version); char* arch(void) { @@ -16,8 +15,9 @@ char* sbcl_bin(char* file); char* sbcl_version_bin(char* impl,char* version) { char* home= homedir(); - char* platforms_html=cat(home,"tmp/sbcl.html",NULL); + char* platforms_html=cat(home,"tmp",SLASH,"sbcl.html",NULL); ensure_directories_exist(platforms_html); + /* TBD */ if(version) { s(platforms_html); @@ -36,19 +36,91 @@ char* sbcl_version_bin(char* impl,char* version) } } +char* sbcl_bin_extention(char* impl,char* version) { +#ifdef _WIN32 + return "msi"; +#else + return "tar.bz2"; +#endif +} + char* sbcl_uri_bin(char* impl,char* version) { /*should I care about it's existance? */ return cat("http://prdownloads.sourceforge.net/sbcl/sbcl-",version, - "-binary.tar.bz2",NULL); + "-binary.", + sbcl_bin_extention(impl,version) + ,NULL); } +#ifdef _WIN32 +int sbcl_bin_expand(char* impl,char* version){ + int ret; + char* home= homedir(); + char* archive=cat(impl,"-",version,".msi",NULL); + char* log_path=cat(home,"impls",SLASH,"log",SLASH,impl,"-",version,SLASH,"install.log",NULL); + char* dist_path; + int pos=position_char("-",impl); + if(pos!=-1) { + impl=subseq(impl,0,pos); + }else + impl=q(impl); + version=q(version); + dist_path=cat(home,"src",SLASH,impl,"-",version,SLASH,NULL); + printf("Extracting archive. %s to %s\n",archive,dist_path); + archive=s_cat(q(home),q("archives"),q(SLASH),archive,NULL); + delete_directory(dist_path,1); + ensure_directories_exist(dist_path); + ensure_directories_exist(log_path); + + char* cmd=cat("start /wait msiexec.exe /a \"", + archive, + "\" targetdir=\"", + dist_path, + "\" /qn /lv ", + "\"", + log_path, + "\"", + NULL); + ret=system(cmd); + s(impl); + s(dist_path); + s(log_path); + s(archive); + s(cmd),s(home),s(version); + return !ret; +} +int sbcl_bin_install(char* impl,char* version) { + char* home= homedir(); + char* str; + char* version_num= subseq(version,0,position_char("-",version)); + str=cat("echo f|xcopy \"", + home,"src\\sbcl-",version,"\\PFiles\\Steel Bank Common Lisp\\",version_num,"\\sbcl.exe\" \"", + home,"impls\\sbcl-",version,"\\bin\\sbcl.exe\" >NUL",NULL); + system(str),s(str); + str=cat("echo f|xcopy \"", + home,"src\\sbcl-",version,"\\PFiles\\Steel Bank Common Lisp\\",version_num,"\\sbcl.core\" \"", + home,"impls\\sbcl-",version,"\\lib\\sbcl\\sbcl.core\" >NUL",NULL); + system(str),s(str); + str=cat("echo d|xcopy \"", + home,"src\\sbcl-",version,"\\PFiles\\Steel Bank Common Lisp\\",version_num,"\\contrib\" \"", + home,"impls\\sbcl-",version,"\\lib\\sbcl\\contrib\" >NUL",NULL); + system(str),s(str); + s(home); +} +#endif + install_cmds install_sbcl_bin_full[]={ start, download, +#ifndef _WIN32 expand, sbcl_install, +#else + sbcl_bin_expand, + sbcl_bin_install, +#endif NULL }; -struct install_impls impls_sbcl_bin={ "sbcl-bin", install_sbcl_bin_full,sbcl_version_bin,sbcl_uri_bin,sbcl_extention}; +struct install_impls impls_sbcl_bin={ "sbcl-bin", install_sbcl_bin_full,sbcl_version_bin,sbcl_uri_bin,sbcl_bin_extention}; diff --git a/src/cmds/pull/sbcl.c b/src/cmds/pull/sbcl.c index 1679535..165e88c 100644 --- a/src/cmds/pull/sbcl.c +++ b/src/cmds/pull/sbcl.c @@ -86,7 +86,7 @@ int sbcl_install(char* impl,char* version) { printf("done.\n"); return ret; #else -#error not implemented. + #endif } diff --git a/src/cmds/run/cmd.c b/src/cmds/run/cmd.c index 397f07a..858db7a 100644 --- a/src/cmds/run/cmd.c +++ b/src/cmds/run/cmd.c @@ -1,8 +1,22 @@ #include #include +#ifdef _WIN32 +#include +#endif #include "util.h" #include "opt.h" +#ifdef _WIN32 +BOOL WINAPI ConsoleCtrlHandler(DWORD ctrlChar){ + CHAR szPrintBuffer[512]; + DWORD nCharsWritten; + if(CTRL_C_EVENT == ctrlChar){ + return TRUE; + } + return FALSE; +} +#endif + int cmd_run(int argc,char **argv) { int ret=1; @@ -41,10 +55,14 @@ int cmd_run(int argc,char **argv) } } if(strcmp(impl,"sbcl")==0) { - char* impl_path= cat(home,"impls/",impl,"-",version,NULL); + char* impl_path= cat(home,"impls",SLASH,impl,"-",version,NULL); int core_p=1; offset=2; - bin= cat(impl_path,"/bin/sbcl",NULL); + bin= cat(impl_path,SLASH,"bin",SLASH,"sbcl", +#ifdef _WIN32 + ".exe", +#endif + NULL); for(i=0;i #include #include +#else +#include +#include +#include #endif #ifdef HAVE_SYS_STAT_H #include @@ -188,8 +192,8 @@ char* downcase(char* orig) { char* append_trail_slash(char* str) { char* ret; - if(str[strlen(str)-1]!='/') { - ret=s_cat2(q(str),q("/")); + if(str[strlen(str)-1]!=SLASH[0]) { + ret=s_cat2(q(str),q(SLASH)); }else { ret=q(str); } @@ -198,9 +202,6 @@ char* append_trail_slash(char* str) { } char* homedir(void) { -#ifdef _WIN32 - return q("/dummy"); -#else char *c; char *postfix="_HOME"; struct passwd * pwd; @@ -213,17 +214,22 @@ char* homedir(void) { if(env) { return append_trail_slash(q(env)); } +#ifdef _WIN32 + TCHAR szAppData[MAX_PATH]; + if(SUCCEEDED(SHGetFolderPath(NULL, CSIDL_PROFILE, NULL, 0, szAppData))) { + c=q(szAppData); + } +#else pwd= getpwnam(getenv("USER")); if(pwd) { c=q(pwd->pw_dir); - }else { + } +#endif + else { /* error? */ return NULL; } - - c=append_trail_slash(c); - return s_cat(c,q("."),q(PACKAGE),q("/"),NULL); -#endif + return s_cat(append_trail_slash(c),q("."),q(PACKAGE),q(SLASH),NULL); } char* pathname_directory(char* path) { @@ -251,13 +257,13 @@ char* file_namestring(char* path) { char* ensure_directories_exist (char* path) { int len = strlen(path); if(len) { - for(--len;(path[len]!='/'||len==-1);--len); + for(--len;(path[len]!=SLASH[0]||len==-1);--len); path=subseq(path,0,len+1); } #ifndef _WIN32 char* cmd=s_cat2(q("mkdir -p "),path); #else - char* cmd=q(""); + char* cmd=s_cat(q("mkdir "),path,q(" 2>NUL"),NULL); #endif if(system(cmd)==-1) { printf("failed:%s\n",cmd); @@ -318,7 +324,18 @@ int delete_directory(char* pathspec,int recursive) { return 1; } #else - #error not implemented delete_directory + if(!recursive) { + return(!!RemoveDirectory(pathspec)); + }else { + SHFILEOPSTRUCT fs; + ZeroMemory(&fs, sizeof(SHFILEOPSTRUCT)); + fs.hwnd = NULL; + fs.wFunc = FO_DELETE; + fs.pFrom = pathspec; + fs.pTo = NULL; + fs.fFlags=FOF_SIMPLEPROGRESS|FOF_NOCONFIRMATION; + return (SHFileOperation(&fs) == 0); + } #endif } @@ -335,7 +352,7 @@ int delete_file(char* pathspec) { return 1; } #else - #error not implemented delete_file +// #error not implemented delete_file #endif } @@ -459,6 +476,7 @@ int free_cmdline(char** argv) int system_redirect(const char* cmd,char* filename) { +#ifndef _WIN32 pid_t pid; int fd[2]; char c; @@ -498,10 +516,12 @@ int system_redirect(const char* cmd,char* filename) } } return(0); +#endif } int system_redirect_function(const char* cmd,Function1 f) { +#ifndef _WIN32 pid_t pid; int fd[2]; char c; @@ -527,27 +547,37 @@ int system_redirect_function(const char* cmd,Function1 f) FILE *in,*out; close(fd[1]); if((in=fdopen(fd[0], "r"))!=NULL) { - f(in); + f((LVal)in); fclose(in); } } return(0); +#endif } char* uname(void) { +#ifndef _WIN32 char *p=system_("uname"); char *p2; p2=remove_char("\r\n",p); s(p); return downcase(p2); +#else + return q("windows"); +#endif } char* uname_m(void) { +#ifndef _WIN32 char *p=system_("uname -m"); char *p2; p2=remove_char("\r\n",p); s(p); return substitute_char('-','_',p2); +#else + /*TBD check x86 or x86-64 */ + return q("x86"); +#endif } char* which(char* cmd) { @@ -560,7 +590,7 @@ char* which(char* cmd) { LVal directory(char* path) { - //#ifndef _WIN32 +#ifndef _WIN32 LVal ret=0; DIR* dir=opendir(path); struct dirent *dirent; @@ -576,7 +606,7 @@ LVal directory(char* path) } closedir(dir); return ret; - //#endif +#endif } @@ -596,7 +626,7 @@ void atexit_handler(void) { void setup_signal_handler (char* file_to_delete) { - //#ifndef _WIN32 +#ifndef _WIN32 atexit_delete=q(file_to_delete); signal(SIGHUP, signal_callback_handler); signal(SIGINT, signal_callback_handler); @@ -604,7 +634,7 @@ void setup_signal_handler (char* file_to_delete) signal(SIGQUIT, signal_callback_handler); signal(SIGTERM, signal_callback_handler); atexit(atexit_handler); - //#endif +#endif } /*list*/ diff --git a/src/util.h b/src/util.h index e43c35d..c34e263 100644 --- a/src/util.h +++ b/src/util.h @@ -14,6 +14,12 @@ struct Cons { LVal next; }; +#ifdef _WIN32 +#define SLASH "\\" +#else +#define SLASH "/" +#endif + typedef LVal (*Function1)(LVal v); typedef LVal (*Compare2)(LVal v1,LVal v2);