#!/bin/ch /* Ch package installer script in Ch */ // pkginstall.ch version 1.0.2, April 8, 2005 // *) If a package already installed, after uninstallation, // install the new package immediately. // pkginstall.ch version 1.0.1, April 8, 2005 // *) fixed installation in a dir with blank space // pkginstall.ch version 1.0.1, April 6, 2005 // *) fixed installation with large number of .chf files in lib // pkginstall.ch version 1.0, March 23 2005 /* By default, pkginstall installs a package in the current directory into the /package and copies required header files in package/include into the CHHOME/toolkit/include directory. It has minimized changes. If you want to install ch package into your preferred directory, you can specify it in the comand line. During the installation, it will modify _ipath and _ppath in .chrc in Unix or _chrc in Windows in the user home directory. During installation, an installation file is created under the /package/installed directory with a list of the installed directories and files. This program can also uninstall a Ch Package by removing header files installed into the CHHOME/toolkit/include directory and the package in the CHHOME/package directory based on the corresponding package file in CHHOME/package/installed directory. Usage: pkginstall.ch [-u] [-d directory] PackageName -u uninstall 'packagename' -d directory directory to install 'PackageName' Examples: (1) uninstallation: pkginstall.ch -u chpng (2) installation to the default directory: pkginstall.ch chpng (3) installation to your preferred directory: pkginstall.ch -d /your/preferred/directory chpng */ #include #include #include #include int main(int argc, char **argv) { char usage[] = "Usage: pkginstall.ch [-u] [-d directory] package\n" " -u uninstall 'package'\n" " -d directory directory to install 'package'\n" " Examples:\n" " (1) uninstallation:\n" " pkginstall.ch -u chpng \n" " (2) installation to the default directory:\n" " pkginstall.ch chpng\n" " (3) installation to your preferred directory:\n" " pkginstall.ch -d /your/preferred/directory chpng\n"; string_t pkgname; // chpng string_t chhome; // C:/ch string_t chtoolkit; // C:/ch/toolkit string_t chtoolkitinc; // C:/ch/toolkit/include string_t chpackage; // C:/ch/package string_t chpackagename; // C:/ch/package/chpng string_t chpackagenameinc; // C:/ch/package/chpng/include string_t chpackageinstalled; // C:/ch/package/installed string_t chpackageinstallpkg; // C:/ch/package/installed/chpng string_t installedfiles; // files listed in $chpackageinstallpkg string_t headerfiles; // installed header files in $chtoolkitinc int u_option = false; // -u option int d_option = false; // -d option char *s, check; string_t cwd = _cwd; string_t token; string_t str_temp; string_t dotchrc; // .chrc or _chrc string_t str_chrc_file; // contents of ~/.chrc or ~/_chrc int install_file_ok = 0; int pkg_dir_ok = 0; FILE *fptr_installed; FILE *fptr_chrc; argc--; argv++; while(argc>0 && **argv =='-') { for(s = argv[0]+1; *s&&*s!=' '; s++) /* empty space not valid option */ switch(*s) { case 'u': u_option = true; /* uninstall package */ break; case 'd': /* the directory to install package */ d_option = true; argc--; argv++; chpackage = *argv; break; default: fprintf(stderr,"Warning: invalid option %c\n\n", *s); fprintf(stderr,usage); exit(1); break; } argc--; argv++; } if(argc==1) { /* get the package name */ if((*argv)[strlen(*argv)-1] == '/') /* change "chpng/" to "chpng" */ { fprintf(stderr, "Error: invalid package name '%s'\n\n", *argv); fprintf(stderr,usage); exit(1); } pkgname = *argv; } else { fprintf(stderr,usage); exit(1); } /* Get installation directories for Ch package */ chhome=getenv("CHHOME"); if (chhome==NULL) { printf("Sorry, CHHOME cannot be found\n"); printf("Please install Ch first from http://www.softintegration.com\n"); exit(0); } chtoolkit = stradd(chhome, "/toolkit"); chtoolkitinc = stradd(chhome, "/toolkit/include"); if(d_option == false) { chpackage = stradd(chhome, "/package"); chpackageinstalled = stradd(chhome, "/package/installed"); chpackageinstallpkg = stradd(chhome, "/package/installed/", pkgname); } chpackagename = stradd(chpackage, "/", pkgname); chpackagenameinc = stradd(chpackagename, "/include"); if(access(chpackage, W_OK)) { if(u_option == true) { fprintf(stderr, "You do not have privilege to remove this package.\n"); fprintf(stderr, "Please login as 'root' to run this script\n"); exit(0); } else if(d_option == true) { fprintf(stderr, "You do not have privilege to install this package in '%s'\n", chpackagename); exit(0); } else { fprintf(stderr, "You do not have privilege to install this package in '%s'\n", chpackagename); fprintf(stderr, "Please login as 'root' to run this script\n"); fprintf(stderr, "or provide a directory to install this package.\n\n"); fprintf(stderr,usage); exit(0); } } if(u_option) /* uninstall package */ { // package exists ? if(!access(chpackagename, R_OK)) pkg_dir_ok = 1; // installation file exists ? if(!access(chpackageinstallpkg, R_OK)) install_file_ok = 1; if( pkg_dir_ok && !install_file_ok) { fprintf(stderr, "\nPackage '%s' appears to have been installed\n" "but the Installation information file does not exist.\n" "Would you like to completely remove the directory %s (Y or N)?:" , pkgname, chpackagename); check = getchar(); if (!(check=='y' || check == 'Y')) { exit(1); } while(getchar() != '\n'); printf("\n"); rm -rf $chpackagename } else if(!pkg_dir_ok && !install_file_ok) { fprintf(stderr, "\nPackage '%s' was not installed\n", pkgname); exit(0); } else { if(!pkg_dir_ok) { fprintf(stderr, "\nThe package directory does not exist but an installation" " file for the\npackage was found. Removing possible" " remaining files.\n"); } installedfiles = `cat $chpackageinstallpkg`; foreach(token; installedfiles) { rm -rf $token } rm -rf $chpackageinstallpkg } printf("\nPackage '%s' has been uninstalled.\n\n", pkgname); exit(0); } /* end uninstall option */ if(access(pkgname, R_OK)) { fprintf(stderr, "\nPackage '%s' not found in the current diretory.\n\n", pkgname); exit(1); } if(!access(chpackageinstallpkg, R_OK)) { printf("\nPackage '%s' was already installed.\n" "Uninstall package '%s'(Y or N)?: ", pkgname, pkgname); check = getchar(); if( check != 'y' && check != 'Y' ) exit(0); while(getchar() != '\n'); ./pkginstall.ch -u $pkgname ./pkginstall.ch $pkgname exit(0); } if(!access(chpackagename, R_OK)) { fprintf(stderr, "\nIt appears that the %s package was installed by manually without running\n" "pkginstall.ch or the package directory was not completely removed\n" "during previous uninstallation.\n" "Overwrite and continue installation (Y or N)?: ", pkgname); check = getchar(); if (!(check=='y' || check == 'Y')) { exit(1); } while(getchar() != '\n'); printf("\n"); } printf("Install package '%s' to %s now, please wait...\n", pkgname, chpackage); #ifdef _WIN32_ tar cf $(pkgname).tar $(pkgname) cd $chpackage tar xf "$cwd/$(pkgname).tar" cd $cwd rm -f $(pkgname).tar #else tar cf - $(pkgname) | (cd $chpackage; tar xf - ) #endif /* install in the default package dir CHHOME/package */ if(d_option == false) { if(access(chpackageinstalled, R_OK) ) { mkdir $chpackageinstalled } if((fptr_installed = fopen(chpackageinstallpkg, "w")) == NULL) { fprintf(stderr, "\n\nERROR: fopen: cannot open file %s for write.\n\n", chpackageinstallpkg); exit(1); } fprintf(fptr_installed, "%s\n", chpackagename); cd $chpackagenameinc headerfiles = `ls`; foreach(token; headerfiles) { cp -rfp $token $chtoolkitinc fprintf(fptr_installed, "%s\n", stradd(chtoolkitinc, "/",token)); } fclose( fptr_installed); } else { #if defined(_WIN32_) dotchrc = "_chrc"; #else dotchrc = ".chrc"; #endif cd ~ if(access(dotchrc, F_OK)) { fprintf(stderr, "\nERROR: ~/'%s' does not exist\n" "run 'ch -d' to create it.\n"); exit(0); } str_chrc_file = `cat $dotchrc`; str_temp = stradd("_ipath=stradd(_ipath,\"",chpackagenameinc, ";\");"); foreach(token;str_chrc_file;"\0";" ") { if(!strcmp(token, str_temp)) { token = "found"; break; } } if(token == NULL) { if( (fptr_chrc = fopen(dotchrc, "a")) == NULL) { fprintf(stderr, "\nERROR: fopen: Unable to open ~/%s for append\n", dotchrc); } else { fprintf(fptr_chrc, "%s\n", str_temp); str_temp = stradd("_ppath=stradd(_ppath,\"",chpackage, ";\");"); fprintf(fptr_chrc, "%s\n", str_temp); fclose( fptr_chrc); } } cd - } printf("Package '%s' has been successfully installed.\n\n", pkgname); if(!access(stradd(chpackagename, "/demos"), R_OK)) { printf("Please try demo programs for this package in \n" "%s\n\n", stradd(chpackagename, "/demos")); } if(!access("postinstall.ch", R_OK)) { printf("You must run the post installation program,\n" " %s\nbefore running any demos.\n\n", "postinstall.ch"); } return 0; }