Back to index

lightning-sunbird  0.9+nobinonly
Defines | Typedefs | Enumerations | Functions
install.h File Reference
#include <prio.h>
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Defines

#define PK11_INSTALL_SUCCESS   PK11_INSTALL_NO_ERROR

Typedefs

typedef void(* Pk11Install_ErrorHandler )(char *)

Enumerations

enum  Pk11Install_Error {
  PK11_INSTALL_NO_ERROR = 0, PK11_INSTALL_DIR_DOESNT_EXIST, PK11_INSTALL_FILE_DOESNT_EXIST, PK11_INSTALL_FILE_NOT_READABLE,
  PK11_INSTALL_ERROR_STRING, PK11_INSTALL_JAR_ERROR, PK11_INSTALL_NO_INSTALLER_SCRIPT, PK11_INSTALL_DELETE_TEMP_FILE,
  PK11_INSTALL_OPEN_SCRIPT_FILE, PK11_INSTALL_SCRIPT_PARSE, PK11_INSTALL_SEMANTIC, PK11_INSTALL_SYSINFO,
  PK11_INSTALL_NO_PLATFORM, PK11_INSTALL_BOGUS_REL_DIR, PK11_INSTALL_NO_MOD_FILE, PK11_INSTALL_ADD_MODULE,
  PK11_INSTALL_JAR_EXTRACT, PK11_INSTALL_DIR_NOT_WRITEABLE, PK11_INSTALL_CREATE_DIR, PK11_INSTALL_REMOVE_DIR,
  PK11_INSTALL_EXEC_FILE, PK11_INSTALL_WAIT_PROCESS, PK11_INSTALL_PROC_ERROR, PK11_INSTALL_USER_ABORT,
  PK11_INSTALL_UNSPECIFIED, PK11_INSTALL_NO_ERROR = 0, PK11_INSTALL_DIR_DOESNT_EXIST, PK11_INSTALL_FILE_DOESNT_EXIST,
  PK11_INSTALL_FILE_NOT_READABLE, PK11_INSTALL_ERROR_STRING, PK11_INSTALL_JAR_ERROR, PK11_INSTALL_NO_INSTALLER_SCRIPT,
  PK11_INSTALL_DELETE_TEMP_FILE, PK11_INSTALL_OPEN_SCRIPT_FILE, PK11_INSTALL_SCRIPT_PARSE, PK11_INSTALL_SEMANTIC,
  PK11_INSTALL_SYSINFO, PK11_INSTALL_NO_PLATFORM, PK11_INSTALL_BOGUS_REL_DIR, PK11_INSTALL_NO_MOD_FILE,
  PK11_INSTALL_ADD_MODULE, PK11_INSTALL_JAR_EXTRACT, PK11_INSTALL_DIR_NOT_WRITEABLE, PK11_INSTALL_CREATE_DIR,
  PK11_INSTALL_REMOVE_DIR, PK11_INSTALL_EXEC_FILE, PK11_INSTALL_WAIT_PROCESS, PK11_INSTALL_PROC_ERROR,
  PK11_INSTALL_USER_ABORT, PK11_INSTALL_UNSPECIFIED
}

Functions

void Pk11Install_Init ()
Pk11Install_ErrorHandler Pk11Install_SetErrorHandler (Pk11Install_ErrorHandler handler)
void Pk11Install_Release ()
Pk11Install_Error Pk11Install_DoInstall (char *jarFile, const char *installDir, const char *tempDir, PRFileDesc *feedback, short force, PRBool noverify)

Define Documentation

Definition at line 75 of file install.h.


Typedef Documentation

typedef void(* Pk11Install_ErrorHandler)(char *)

Definition at line 46 of file install.h.


Enumeration Type Documentation

Enumerator:
PK11_INSTALL_NO_ERROR 
PK11_INSTALL_DIR_DOESNT_EXIST 
PK11_INSTALL_FILE_DOESNT_EXIST 
PK11_INSTALL_FILE_NOT_READABLE 
PK11_INSTALL_ERROR_STRING 
PK11_INSTALL_JAR_ERROR 
PK11_INSTALL_NO_INSTALLER_SCRIPT 
PK11_INSTALL_DELETE_TEMP_FILE 
PK11_INSTALL_OPEN_SCRIPT_FILE 
PK11_INSTALL_SCRIPT_PARSE 
PK11_INSTALL_SEMANTIC 
PK11_INSTALL_SYSINFO 
PK11_INSTALL_NO_PLATFORM 
PK11_INSTALL_BOGUS_REL_DIR 
PK11_INSTALL_NO_MOD_FILE 
PK11_INSTALL_ADD_MODULE 
PK11_INSTALL_JAR_EXTRACT 
PK11_INSTALL_DIR_NOT_WRITEABLE 
PK11_INSTALL_CREATE_DIR 
PK11_INSTALL_REMOVE_DIR 
PK11_INSTALL_EXEC_FILE 
PK11_INSTALL_WAIT_PROCESS 
PK11_INSTALL_PROC_ERROR 
PK11_INSTALL_USER_ABORT 
PK11_INSTALL_UNSPECIFIED 
PK11_INSTALL_NO_ERROR 
PK11_INSTALL_DIR_DOESNT_EXIST 
PK11_INSTALL_FILE_DOESNT_EXIST 
PK11_INSTALL_FILE_NOT_READABLE 
PK11_INSTALL_ERROR_STRING 
PK11_INSTALL_JAR_ERROR 
PK11_INSTALL_NO_INSTALLER_SCRIPT 
PK11_INSTALL_DELETE_TEMP_FILE 
PK11_INSTALL_OPEN_SCRIPT_FILE 
PK11_INSTALL_SCRIPT_PARSE 
PK11_INSTALL_SEMANTIC 
PK11_INSTALL_SYSINFO 
PK11_INSTALL_NO_PLATFORM 
PK11_INSTALL_BOGUS_REL_DIR 
PK11_INSTALL_NO_MOD_FILE 
PK11_INSTALL_ADD_MODULE 
PK11_INSTALL_JAR_EXTRACT 
PK11_INSTALL_DIR_NOT_WRITEABLE 
PK11_INSTALL_CREATE_DIR 
PK11_INSTALL_REMOVE_DIR 
PK11_INSTALL_EXEC_FILE 
PK11_INSTALL_WAIT_PROCESS 
PK11_INSTALL_PROC_ERROR 
PK11_INSTALL_USER_ABORT 
PK11_INSTALL_UNSPECIFIED 

Definition at line 48 of file install.h.


Function Documentation

Pk11Install_Error Pk11Install_DoInstall ( char *  jarFile,
const char *  installDir,
const char *  tempDir,
PRFileDesc feedback,
short  force,
PRBool  noverify 
)

Definition at line 351 of file install.c.

{
       JAR *jar;
       char *installer;
       unsigned long installer_len;
       int status;
       Pk11Install_Error ret;
       PRBool made_temp_file;
       Pk11Install_Info installInfo;
       Pk11Install_Platform *platform;
       char* errMsg;
       char sysname[SYS_INFO_BUFFER_LENGTH], release[SYS_INFO_BUFFER_LENGTH],
       arch[SYS_INFO_BUFFER_LENGTH];
       char *myPlatform;

       jar=NULL;
       ret = PK11_INSTALL_UNSPECIFIED;
       made_temp_file=PR_FALSE;
       errMsg=NULL;
       Pk11Install_Info_init(&installInfo);

       /*
       printf("Inside DoInstall, jarFile=%s, installDir=%s, tempDir=%s\n",
              jarFile, installDir, tempDir);
       */

       /*
        * Check out jarFile and installDir for validity
        */
       if( PR_Access(installDir, PR_ACCESS_EXISTS) != PR_SUCCESS ) {
              error(PK11_INSTALL_DIR_DOESNT_EXIST, installDir);
              return PK11_INSTALL_DIR_DOESNT_EXIST;
       }
       if(!tempDir) {
              tempDir = ".";
       }
       if( PR_Access(tempDir, PR_ACCESS_EXISTS) != PR_SUCCESS ) {
              error(PK11_INSTALL_DIR_DOESNT_EXIST, tempDir);
              return PK11_INSTALL_DIR_DOESNT_EXIST;
       }
       if( PR_Access(tempDir, PR_ACCESS_WRITE_OK) != PR_SUCCESS ) {
              error(PK11_INSTALL_DIR_NOT_WRITEABLE, tempDir);
              return PK11_INSTALL_DIR_NOT_WRITEABLE;
       }
       if( (PR_Access(jarFile, PR_ACCESS_EXISTS) != PR_SUCCESS) ) {
              error(PK11_INSTALL_FILE_DOESNT_EXIST, jarFile);
              return PK11_INSTALL_FILE_DOESNT_EXIST;
       }
       if( PR_Access(jarFile, PR_ACCESS_READ_OK) != PR_SUCCESS ) {
              error(PK11_INSTALL_FILE_NOT_READABLE, jarFile);
              return PK11_INSTALL_FILE_NOT_READABLE;
       }

       /*
        * Extract the JAR file
        */
       jar = JAR_new();
       JAR_set_callback(JAR_CB_SIGNAL, jar, jar_callback);

       if(noverify) {
              status = JAR_pass_archive_unverified(jar, jarArchGuess, jarFile, "url");
       } else {
              status = JAR_pass_archive(jar, jarArchGuess, jarFile, "url");
       }
       if( (status < 0) || (jar->valid < 0) ) {
              if (status >= JAR_BASE && status <= JAR_BASE_END) {
                     error(PK11_INSTALL_JAR_ERROR, jarFile, JAR_get_error(status));
              } else {
                     error(PK11_INSTALL_JAR_ERROR, jarFile,
                       mySECU_ErrorString((int16) PORT_GetError()) );
              }
              ret=PK11_INSTALL_JAR_ERROR;
              goto loser;
       }
       /*printf("passed the archive\n");*/

       /*
        * Show the user security information, allow them to abort or continue
        */
       if( Pk11Install_UserVerifyJar(jar, PR_STDOUT,
              force?PR_FALSE:PR_TRUE) && !force) {
              if(feedback) {
                     PR_fprintf(feedback, msgStrings[USER_ABORT]);
              }
              ret=PK11_INSTALL_USER_ABORT;
              goto loser;
       }

       /*
        * Get the name of the installation file
        */
       if( JAR_get_metainfo(jar, NULL, INSTALL_METAINFO_TAG, (void**)&installer,
              (unsigned long*)&installer_len) ) {
              error(PK11_INSTALL_NO_INSTALLER_SCRIPT);
              ret=PK11_INSTALL_NO_INSTALLER_SCRIPT;
              goto loser;
       }
       if(feedback) {
              PR_fprintf(feedback, msgStrings[INSTALLER_SCRIPT_NAME], installer);
       }

       /*
        * Extract the installation file
        */
       if( PR_Access(SCRIPT_TEMP_FILE, PR_ACCESS_EXISTS) == PR_SUCCESS) {
              if( PR_Delete(SCRIPT_TEMP_FILE) != PR_SUCCESS) {
                     error(PK11_INSTALL_DELETE_TEMP_FILE, SCRIPT_TEMP_FILE);
                     ret=PK11_INSTALL_DELETE_TEMP_FILE;
                     goto loser;
              }
       }
       if(noverify) {
              status = JAR_extract(jar, installer, SCRIPT_TEMP_FILE);
       } else {
              status = JAR_verified_extract(jar, installer, SCRIPT_TEMP_FILE);
       }
       if(status) {
              if (status >= JAR_BASE && status <= JAR_BASE_END) {
                     error(PK11_INSTALL_JAR_EXTRACT, installer, JAR_get_error(status));
              } else {
                     error(PK11_INSTALL_JAR_EXTRACT, installer,
                       mySECU_ErrorString((int16) PORT_GetError()) );
              }
              ret = PK11_INSTALL_JAR_EXTRACT;
              goto loser;
       } else {
              made_temp_file = PR_TRUE;
       }

       /*
        * Parse the installation file into a syntax tree
        */
       Pk11Install_FD = PR_Open(SCRIPT_TEMP_FILE, PR_RDONLY, 0);
       if(!Pk11Install_FD) {
              error(PK11_INSTALL_OPEN_SCRIPT_FILE, SCRIPT_TEMP_FILE);
              ret=PK11_INSTALL_OPEN_SCRIPT_FILE;
              goto loser;
       }
       if(Pk11Install_yyparse()) {
              error(PK11_INSTALL_SCRIPT_PARSE, installer,
                     Pk11Install_yyerrstr ? Pk11Install_yyerrstr : "");
              ret=PK11_INSTALL_SCRIPT_PARSE;
              goto loser;
       }

#if 0
       /* for debugging */
       Pk11Install_valueList->Print(0);
#endif

       /*
        * From the syntax tree, build a semantic structure
        */
       errMsg = Pk11Install_Info_Generate(&installInfo,Pk11Install_valueList);
       if(errMsg) {
              error(PK11_INSTALL_SEMANTIC, errMsg);
              ret=PK11_INSTALL_SEMANTIC;
              goto loser;
       }
#if 0
       installInfo.Print(0);
#endif

       if(feedback) {
              PR_fprintf(feedback, msgStrings[PARSED_INSTALL_SCRIPT]);
       }

       /*
        * Figure out which platform to use
        */
       {
              sysname[0] = release[0] = arch[0] = '\0';

              if( (PR_GetSystemInfo(PR_SI_SYSNAME, sysname, SYS_INFO_BUFFER_LENGTH)
                            != PR_SUCCESS) ||
                  (PR_GetSystemInfo(PR_SI_RELEASE, release, SYS_INFO_BUFFER_LENGTH)
                            != PR_SUCCESS) ||
                  (PR_GetSystemInfo(PR_SI_ARCHITECTURE, arch, SYS_INFO_BUFFER_LENGTH)
                            != PR_SUCCESS) ) {
                     error(PK11_INSTALL_SYSINFO);
                     ret=PK11_INSTALL_SYSINFO;
                     goto loser;
              }
              myPlatform = PR_smprintf("%s:%s:%s", sysname, release, arch);
              platform = Pk11Install_Info_GetBestPlatform(&installInfo,myPlatform);
              if(!platform) {
                     error(PK11_INSTALL_NO_PLATFORM, myPlatform);
                     PR_smprintf_free(myPlatform);
                     ret=PK11_INSTALL_NO_PLATFORM;
                     goto loser;
              }
              if(feedback) {
                     PR_fprintf(feedback, msgStrings[MY_PLATFORM_IS], myPlatform);
                     PR_fprintf(feedback, msgStrings[USING_PLATFORM],
                    Pk11Install_PlatformName_GetString(&platform->name));
              }
              PR_smprintf_free(myPlatform);
       }

       /* Run the install for that platform */
       ret = DoInstall(jar, installDir, tempDir, platform, feedback, noverify);
       if(ret) {
              goto loser;
       }

       ret = PK11_INSTALL_SUCCESS;
loser:
       if(Pk11Install_valueList) {
              Pk11Install_ValueList_delete(Pk11Install_valueList);
              PR_Free(Pk11Install_valueList);
              Pk11Install_valueList = NULL;
       }
       if(jar) {
              JAR_destroy(jar);
       }
       if(made_temp_file) {
              PR_Delete(SCRIPT_TEMP_FILE);
       }
       if(errMsg) {
              PR_smprintf_free(errMsg);
       }
       return ret;
}

Definition at line 246 of file install.c.

Definition at line 263 of file install.c.