micetools/src/micetools/lib/am/amInstall.c

581 lines
22 KiB
C

#include "amInstall.h"
#include "../util/hex.h"
AM_LIB_C_HEADER(amInstall, AM_INSTALL)
/*********************************************************/
AM_INSTALL_STATUS amInstallResponseCheckQuerySlotStatus(AM_INSTALL_SLOT_STATUS *slotStatus) {
return AM_INSTALL_STATUS_OK;
}
int amInstallResponseCheckQuerySemStatus(void) { return -1; }
int amInstallResponseCheckQueryAppStatus(void) { return -1; }
AM_INSTALL_STATUS amInstallResponseCheckQuerySpd(void *param_1) { return AM_INSTALL_STATUS_OK; }
AM_INSTALL_STATUS amInstallResponseCheckQueryAppdataStatus(int *param_1) {
return AM_INSTALL_STATUS_OK;
}
AM_INSTALL_STATUS amInstallSuicideSub(char *keyword) { return AM_INSTALL_STATUS_OK; }
/*********************************************************/
bool amInstallPcpaGetUlonglong(unsigned long long *dest, char *keyword) {
if (keyword == NULL || dest == NULL) return false;
char *command = pcpaGetCommand(&amInstall.m_pcp, keyword);
if (command == NULL) return false;
errno = 0;
char *end = NULL;
unsigned long long value = strtoull(command, &end, 0);
if (errno == ERANGE || end == NULL || end[0] != '\0') return false;
*dest = value;
return true;
}
AM_INSTALL_STATUS amInstallResponseCheckQueryBr(AM_INSTALL_BOOT_RECORD *bootRecord) {
if (bootRecord == NULL) return AM_INSTALL_STATUS_ERR_INVALID_PARAM;
ZeroMemory(bootRecord, sizeof bootRecord);
amInstallPcpaGetUlonglong(&bootRecord->epbr, "epbr");
amInstallPcpaGetUlonglong(&bootRecord->original0, "original0");
amInstallPcpaGetUlonglong(&bootRecord->original1, "original1");
amInstallPcpaGetUlonglong(&bootRecord->patch0, "patch0");
amInstallPcpaGetUlonglong(&bootRecord->patch1, "patch1");
amInstallPcpaGetUlonglong(&bootRecord->os, "os");
return AM_INSTALL_STATUS_OK;
}
/*********************************************************/
AM_INSTALL_STATUS amInstallInit(void) {
if (amInstall.m_init) return AM_INSTALL_STATUS_ERR_ALREADY_INIT;
amInstall.m_seq = AM_INSTALL_SEQ_NONE;
amInstall.m_nextSeq = AM_INSTALL_SEQ_INVALID;
amInstall.m_requestCode = 0;
amInstall.m_result = AM_INSTALL_STATUS_OK;
amInstall.m_sendBufferLen = 0;
amInstall.m_semid = 0;
amInstall.m_cmdPort = 40102;
amInstall.m_dataPort = 40103;
e_pcpa_t err = pcpaInitStream(&amInstall.m_pcp);
if (err == e_pcpa_wsa_noinit) {
if (amInstallDebugLevel > 0) amiDebugLog("Error: Winsocket2 Library is not ready.");
return AM_INSTALL_STATUS_ERR_PRECONDITION;
}
if (err != e_pcpa_ok) {
if (amInstallDebugLevel > 0)
amiDebugLog("Error: System error happened in pcp stream. ErrorCode = %d.", err);
return AM_INSTALL_STATUS_ERR_SYS;
}
amInstall.m_init = true;
return AM_INSTALL_STATUS_OK;
}
AM_INSTALL_STATUS amInstallUpdate(void) {
AM_INSTALL_STATUS status;
if (!amInstall.m_init) return AM_INSTALL_STATUS_ERR_NO_INIT;
switch (amInstall.m_seq) {
case AM_INSTALL_SEQ_BUSY:
status = amInstallBusy();
break;
case AM_INSTALL_SEQ_SEND_REQUEST:
status = amInstallSendRequest();
if (status != AM_INSTALL_STATUS_OK) {
amInstall.m_result = status;
return AM_INSTALL_STATUS_OK;
}
return AM_INSTALL_STATUS_OK;
case AM_INSTALL_SEQ_RECV_RESPONSE:
status = amInstallRecvResponse();
break;
case AM_INSTALL_SEQ_CHECK_RESPONSE:
status = amInstallResponseCheck();
if (status != AM_INSTALL_STATUS_OK) {
amInstall.m_result = status;
return AM_INSTALL_STATUS_OK;
}
return AM_INSTALL_STATUS_OK;
case AM_INSTALL_SEQ_OPEN_BINARY:
status = amInstallOpenBinary();
break;
case AM_INSTALL_SEQ_SEND_BINARY:
status = amInstallSendBinaryBuffer(1);
if (status != AM_INSTALL_STATUS_OK) {
amInstall.m_result = status;
return AM_INSTALL_STATUS_OK;
}
return AM_INSTALL_STATUS_OK;
case AM_INSTALL_SEQ_EXIT:
amInstallExit();
amInstall.m_result = AM_INSTALL_STATUS_OK;
return AM_INSTALL_STATUS_OK;
default:
return AM_INSTALL_STATUS_OK;
}
if (status != AM_INSTALL_STATUS_OK) {
amInstall.m_result = status;
return AM_INSTALL_STATUS_OK;
}
return AM_INSTALL_STATUS_OK;
}
AM_INSTALL_STATUS amInstallBusy(void) {
e_pcpa_t err = pcpaIsBusy(&amInstall.m_pcp, 0);
if (err == e_pcpa_ok) {
amInstall.m_seq = amInstall.m_nextSeq;
amInstall.m_nextSeq = AM_INSTALL_SEQ_INVALID;
} else if (err != e_pcpa_to) {
if (amInstallDebugLevel > 0)
amiDebugLog("pcpaIsBusy() Error(%d), NextStatus = %d", err, amInstall.m_nextSeq);
amInstall.m_nextSeq = AM_INSTALL_SEQ_INVALID;
amInstall.m_seq = AM_INSTALL_SEQ_EXIT;
if (err == e_pcpa_no_server) return AM_INSTALL_STATUS_ERR_NO_SERVER;
return AM_INSTALL_STATUS_ERR_PCP;
}
return AM_INSTALL_STATUS_OK;
}
AM_INSTALL_STATUS amInstallSendRequest(void) {
e_pcpa_t err = pcpaSendRequest(&amInstall.m_pcp, 0);
if (err == e_pcpa_ok) {
amInstall.m_seq = AM_INSTALL_SEQ_RECV_RESPONSE;
return AM_INSTALL_STATUS_OK;
}
if (err == e_pcpa_to) {
amInstall.m_seq = AM_INSTALL_SEQ_BUSY;
amInstall.m_nextSeq = AM_INSTALL_SEQ_RECV_RESPONSE;
return AM_INSTALL_STATUS_OK;
}
if (amInstallDebugLevel > 0) amiDebugLog("pcpaSendRequest() Error!!");
amInstall.m_seq = AM_INSTALL_SEQ_EXIT;
return AM_INSTALL_STATUS_ERR_PCP;
}
AM_INSTALL_STATUS amInstallRecvResponse(void) {
e_pcpa_t err = pcpaRecvResponse(&amInstall.m_pcp, 0);
if (err == e_pcpa_ok) {
amInstall.m_seq = AM_INSTALL_SEQ_CHECK_RESPONSE;
return AM_INSTALL_STATUS_OK;
}
if (err == e_pcpa_to) {
amInstall.m_seq = AM_INSTALL_SEQ_BUSY;
amInstall.m_nextSeq = AM_INSTALL_SEQ_CHECK_RESPONSE;
return AM_INSTALL_STATUS_OK;
}
amInstall.m_seq = AM_INSTALL_SEQ_EXIT;
return AM_INSTALL_STATUS_ERR_PCP;
}
AM_INSTALL_STATUS amInstallCodeToStatus(void) {
char *sResult = pcpaGetCommand(&amInstall.m_pcp, "result");
char *sCode = pcpaGetCommand(&amInstall.m_pcp, "code");
if (sResult == NULL) {
return AM_INSTALL_STATUS_ERR_PCP;
}
if (sCode != NULL) {
switch (atoi(sCode)) {
case 0:
return AM_INSTALL_STATUS_OK;
case 1:
return AM_INSTALL_STATUS_ERR_NO_STORAGE;
case 2:
return AM_INSTALL_STATUS_ERR_FORMAT;
case 4:
return AM_INSTALL_STATUS_ERR_EX_PARTITION;
case 5:
return AM_INSTALL_STATUS_ERR_READ_STORAGE;
case 6:
return AM_INSTALL_STATUS_ERR_WRITE_STORAGE;
case 7:
return AM_INSTALL_STATUS_ERR_SPD_CRC;
case 8:
return AM_INSTALL_STATUS_ERR_SPD_VERSION;
case 20:
return AM_INSTALL_STATUS_ERR_SEMAPHORE_ID;
case 21:
return AM_INSTALL_STATUS_ERR_GET_SEMAPHORE;
case 22:
return AM_INSTALL_STATUS_ERR_INVALID_LOCK_ID;
case 40:
return AM_INSTALL_STATUS_ERR_NO_SLOT;
case 41:
return AM_INSTALL_STATUS_ERR_READ_SLOT;
case 42:
return AM_INSTALL_STATUS_ERR_WRITE_SLOT;
case 60:
return AM_INSTALL_STATUS_ERR_DIFF_APPLICATION;
case 61:
return AM_INSTALL_STATUS_ERR_APPLICATION_SIZE;
case 62:
return AM_INSTALL_STATUS_ERR_SEGMENT_OFFSET;
case 63:
return AM_INSTALL_STATUS_ERR_UPDATE_STATUS;
case 64:
return AM_INSTALL_STATUS_ERR_REQUEST;
}
}
if (strcmp(sResult, "success") == 0) return AM_INSTALL_STATUS_OK;
if (strcmp(sResult, "invalid_parameter") != 0) {
if (strcmp(sResult, "invalid_request") != 0) {
return AM_INSTALL_STATUS_ERR_PCP;
}
}
return AM_INSTALL_STATUS_ERR_INVALID_COMMAND;
}
bool amInstallPcpaGetInt(char *keyword, unsigned int *dest) {
if (keyword == NULL || dest == NULL) return false;
char *command = pcpaGetCommand(&amInstall.m_pcp, keyword);
if (command == NULL) return false;
errno = 0;
char *end = NULL;
unsigned int value = strtoul(command, &end, 0);
if (errno == ERANGE || end == NULL || end[0] != '\0') return false;
*dest = value;
return true;
}
AM_INSTALL_STATUS amInstallTaskRequest(char *keyword) {
pcp_send_data_t *sendData;
if (strcmp(keyword, "query_appdata_status") == 0) {
int status;
if (amInstallResponseCheckQueryAppdataStatus(&status) != AM_INSTALL_STATUS_OK)
return AM_INSTALL_STATUS_ERR_PCP;
bool failed = ((status == 1) || (status == 2));
if (status == 0) {
sendData = pcpaSetSendPacket(&amInstall.m_pcp, "request", "check_appdata");
if (sendData == NULL && amInstallDebugLevel > 0)
amiDebugLog("Error: pcpaSetSendPacket return NULL\n");
sendData = pcpaAddSendPacket(&amInstall.m_pcp, "execute", "1");
if (sendData == NULL && amInstallDebugLevel > 0)
amiDebugLog("Error: pcpaAddSendPacket return NULL\n");
amInstall.m_seq = AM_INSTALL_SEQ_SEND_REQUEST;
}
if (!failed) {
return AM_INSTALL_STATUS_OK;
}
} else {
if (strcmp(keyword, "check_appdata") != 0 && strcmp(keyword, "format_appdata") != 0)
return AM_INSTALL_STATUS_ERR_PCP;
}
sendData = pcpaSetSendPacket(&amInstall.m_pcp, "request", "query_appdata_status");
if (sendData == 0 && amInstallDebugLevel > 0)
amiDebugLog("Error: pcpaSetSendPacket return NULL\n");
amInstall.m_seq = AM_INSTALL_SEQ_SEND_REQUEST;
return AM_INSTALL_STATUS_OK;
}
AM_INSTALL_STATUS amInstallResponseCheck(void) {
char *realKeyword = pcpaGetKeyword(&amInstall.m_pcp, 0);
char *keyword = pcpaGetCommand(&amInstall.m_pcp, "response");
amInstall.m_seq = AM_INSTALL_SEQ_EXIT;
if (realKeyword == NULL) {
if (amInstallDebugLevel > 0) amiDebugLog("Response Error!!! No Keyword.");
return AM_INSTALL_STATUS_ERR_PCP;
}
if (realKeyword[0] == '?') return AM_INSTALL_STATUS_ERR_NO_COMMAND;
if (keyword == NULL) {
if (amInstallDebugLevel > 0) amiDebugLog("Error : No Response");
return AM_INSTALL_STATUS_ERR_PCP;
}
AM_INSTALL_STATUS response_error = amInstallCodeToStatus();
if (response_error != AM_INSTALL_STATUS_OK) return response_error;
switch (amInstall.m_requestCode) {
case AM_INSTALL_REQUEST_QUERY_SLOT_STATUS:
if (strcmp(keyword, "query_slot_status") != 0) {
amInstall.m_result = AM_INSTALL_STATUS_ERR_PCP;
return AM_INSTALL_STATUS_OK;
}
amInstallResponseCheckQuerySlotStatus((AM_INSTALL_SLOT_STATUS *)amInstall.m_value);
return AM_INSTALL_STATUS_OK;
case AM_INSTALL_REQUEST_INSTALL:
if (strcmp(keyword, "install") != 0) return AM_INSTALL_STATUS_ERR_PCP;
unsigned int port = 40103;
amInstallPcpaGetInt("port", &port);
amInstall = amInstall;
amInstall.m_dataPort = port & 0xffff;
amInstall.m_seq = AM_INSTALL_SEQ_OPEN_BINARY;
return AM_INSTALL_STATUS_OK;
case AM_INSTALL_REQUEST_UNINSTALL:
if (strcmp(keyword, "uninstall") != 0) return AM_INSTALL_STATUS_ERR_PCP;
return AM_INSTALL_STATUS_OK;
case AM_INSTALL_REQUEST_CHECK:
if (strcmp(keyword, "check") != 0) return AM_INSTALL_STATUS_ERR_PCP;
return AM_INSTALL_STATUS_OK;
case AM_INSTALL_REQUEST_QUERY_APPLICATION_STATUS:
if (strcmp(keyword, "query_application_status") != 0) return AM_INSTALL_STATUS_ERR_PCP;
*(unsigned int *)amInstall.m_value = amInstallResponseCheckQueryAppStatus();
amInstallPcpaGetInt("busyslot", (unsigned int *)amInstall.Unk51c);
return AM_INSTALL_STATUS_OK;
case AM_INSTALL_REQUEST_SET_APPLICATION_STATUS:
if (strcmp(keyword, "set_application_status") != 0) return AM_INSTALL_STATUS_ERR_PCP;
if (pcpaGetCommand(&amInstall.m_pcp, "lockid") == NULL) return AM_INSTALL_STATUS_OK;
amInstallPcpaGetInt("lockid", (unsigned int *)amInstall.m_value);
return AM_INSTALL_STATUS_OK;
case AM_INSTALL_REQUEST_QUERY_SBR_BOOTSLOT:
if (strcmp(keyword, "query_sbr_bootslot") != 0) return AM_INSTALL_STATUS_ERR_PCP;
unsigned int bootslot = 0;
amInstallPcpaGetInt("bootslot", &bootslot);
*(unsigned int *)amInstall.m_value = bootslot;
return AM_INSTALL_STATUS_OK;
case AM_INSTALL_REQUEST_SET_SBR_BOOTSLOT:
if (strcmp(keyword, "set_sbr_bootslot") != 0) return AM_INSTALL_STATUS_ERR_PCP;
return AM_INSTALL_STATUS_OK;
case AM_INSTALL_REQUEST_QUERY_SEMAPHORE_STATUS:
if (strcmp(keyword, "query_semaphore_status") != 0) return AM_INSTALL_STATUS_ERR_PCP;
*(unsigned int *)amInstall.m_value = amInstallResponseCheckQuerySemStatus();
return AM_INSTALL_STATUS_OK;
case AM_INSTALL_REQUEST_GET_SEMAPHORE:
if (strcmp(keyword, "get_semaphore") == 0) {
unsigned int semid = 0;
amInstallPcpaGetInt("semid", &semid);
*(unsigned int *)amInstall.m_value = semid;
return AM_INSTALL_STATUS_OK;
}
return AM_INSTALL_STATUS_ERR_PCP;
case AM_INSTALL_REQUEST_RELEASE_SEMAPHORE:
if (strcmp(keyword, "release_semaphore") == 0) return AM_INSTALL_STATUS_OK;
return AM_INSTALL_STATUS_ERR_PCP;
case AM_INSTALL_REQUEST_QUERY_SPD:
if (strcmp(keyword, "query_spd") == 0) {
amInstallResponseCheckQuerySpd(amInstall.m_value);
return AM_INSTALL_STATUS_OK;
}
return AM_INSTALL_STATUS_ERR_PCP;
case AM_INSTALL_REQUEST_QUERY_BR:
if (strcmp(keyword, "query_br") == 0) {
amInstallResponseCheckQueryBr(amInstall.m_value);
return AM_INSTALL_STATUS_OK;
}
return AM_INSTALL_STATUS_ERR_PCP;
case AM_INSTALL_REQUEST_QUERY_APPDATA_STATUS:
if (strcmp(keyword, "query_appdata_status") != 0) return AM_INSTALL_STATUS_ERR_PCP;
if (amInstallResponseCheckQueryAppdataStatus(amInstall.m_value) != AM_INSTALL_STATUS_OK)
return AM_INSTALL_STATUS_ERR_PCP;
if ((*(int *)amInstall.m_value != 4) && (*(int *)amInstall.m_value != 5))
return AM_INSTALL_STATUS_OK;
char *sId = pcpaGetCommand(&amInstall.m_pcp, "id");
if (sId == NULL) return AM_INSTALL_STATUS_ERR_PCP;
strcpy_s(amInstall.Unk51c, 4, sId);
return AM_INSTALL_STATUS_OK;
case AM_INSTALL_REQUEST_15:
case AM_INSTALL_REQUEST_16:
return amInstallTaskRequest(keyword);
case AM_INSTALL_REQUEST_QUERY_VOLUME_NAME:
if (strcmp(keyword, "query_volume_name") == 0) {
char *sName = pcpaGetCommand(&amInstall.m_pcp, "name");
if (sName == NULL) return AM_INSTALL_STATUS_OK;
size_t hexLen = strlen(sName);
if (hexLen > 512) hexLen = 512;
hex_to_bin(sName, amInstall.m_value, hexLen);
return AM_INSTALL_STATUS_OK;
}
return AM_INSTALL_STATUS_ERR_PCP;
case AM_INSTALL_REQUEST_18:
return amInstallSuicideSub(keyword);
default:
return AM_INSTALL_STATUS_OK;
}
}
AM_INSTALL_STATUS amInstallOpenBinary(void) {
e_pcpa_t err = pcpaOpenBinaryClient(&amInstall.m_pcp, amInstall.m_dataPort, 0);
if (err == e_pcpa_ok) {
amInstall.m_seq = AM_INSTALL_SEQ_SEND_BINARY;
return AM_INSTALL_STATUS_OK;
}
if (err == e_pcpa_to) {
amInstall.m_seq = AM_INSTALL_SEQ_BUSY;
amInstall.m_nextSeq = AM_INSTALL_SEQ_SEND_BINARY;
return AM_INSTALL_STATUS_OK;
}
if (amInstallDebugLevel > 0) amiDebugLog("pcpaOpenBinaryClient() Error!!");
amInstall.m_seq = AM_INSTALL_SEQ_EXIT;
return AM_INSTALL_STATUS_ERR_PCP;
}
AM_INSTALL_STATUS amInstallSendBinaryBuffer(AM_INSTALL_BLOCKING blocking) {
timeout_t timeout = blocking == AM_INSTALL_BLOCK ? TIMEOUT_NONE : 0;
if (amInstall.m_requestCode != 2) {
amInstall.m_seq = AM_INSTALL_SEQ_EXIT;
amInstall.m_nextSeq = AM_INSTALL_SEQ_INVALID;
return AM_INSTALL_STATUS_ERR_PCP;
}
pcpaSetSendBinaryBuffer(&amInstall.m_pcp, amInstall.m_value, amInstall.m_sendBufferLen);
e_pcpa_t err = pcpaSendBinary(&amInstall.m_pcp, timeout);
if (err == 0) {
amInstall.m_seq = AM_INSTALL_SEQ_EXIT;
return AM_INSTALL_STATUS_OK;
}
if (err == 1) {
amInstall.m_seq = AM_INSTALL_SEQ_BUSY;
amInstall.m_nextSeq = AM_INSTALL_SEQ_EXIT;
return AM_INSTALL_STATUS_OK;
}
amInstall.m_seq = AM_INSTALL_SEQ_EXIT;
return AM_INSTALL_STATUS_ERR_PCP;
}
AM_INSTALL_STATUS amInstallExit(void) {
pcpaCloseBinary(&amInstall.m_pcp);
pcpaClose(&amInstall.m_pcp);
amInstall.m_seq = AM_INSTALL_SEQ_NONE;
amInstall.m_result = AM_INSTALL_STATUS_OK;
return AM_INSTALL_STATUS_OK;
}
AM_INSTALL_STATUS amInstallOpenBinaryEx(void) {
e_pcpa_t err = pcpaOpenBinaryClient(&amInstall.m_pcp, amInstall.m_dataPort, TIMEOUT_NONE);
if (err != e_pcpa_ok) {
pcpaCloseBinary(&amInstall.m_pcp);
pcpaClose(&amInstall.m_pcp);
amInstall.m_seq = AM_INSTALL_SEQ_NONE;
amInstall.m_result = AM_INSTALL_STATUS_OK;
amInstall.m_nextSeq = AM_INSTALL_SEQ_INVALID;
return AM_INSTALL_STATUS_ERR_PCP;
}
amInstall.m_seq = AM_INSTALL_SEQ_SEND_BINARY;
return AM_INSTALL_STATUS_OK;
}
AM_INSTALL_STATUS amInstallSendAndReceiveEx(void) {
AM_INSTALL_STATUS err;
amInstall.m_result = AM_INSTALL_STATUS_OK;
err = amInstallOpenEx();
if (err == AM_INSTALL_STATUS_OK) {
do {
err = amInstallSendAndRecvEx();
if (err != AM_INSTALL_STATUS_OK) return err;
err = amInstallResponseCheck();
if (amInstall.m_result != AM_INSTALL_STATUS_OK) err = amInstall.m_result;
if (amInstall.m_seq == AM_INSTALL_SEQ_OPEN_BINARY) {
err = amInstallOpenBinaryEx();
if (err != AM_INSTALL_STATUS_OK) return err;
err = amInstallSendBinaryBuffer(AM_INSTALL_BLOCK);
if (err != AM_INSTALL_STATUS_OK) break;
}
} while (amInstall.m_seq != AM_INSTALL_SEQ_EXIT);
pcpaCloseBinary(&amInstall.m_pcp);
pcpaClose(&amInstall.m_pcp);
amInstall.m_seq = AM_INSTALL_SEQ_NONE;
amInstall.m_result = AM_INSTALL_STATUS_OK;
}
return err;
}
AM_INSTALL_STATUS amInstallSendAndRecvEx(void) {
e_pcpa_t err = pcpaSendRequest(&amInstall.m_pcp, TIMEOUT_NONE);
if (err != e_pcpa_ok) {
if (amInstallDebugLevel > 0) amiDebugLog("pcpaSendRequest Error!!");
pcpaCloseBinary(&amInstall.m_pcp);
pcpaClose(&amInstall.m_pcp);
amInstall = amInstall;
amInstall.m_seq = AM_INSTALL_SEQ_NONE;
amInstall.m_result = AM_INSTALL_STATUS_OK;
amInstall.m_nextSeq = AM_INSTALL_SEQ_INVALID;
return AM_INSTALL_STATUS_ERR_PCP;
}
err = pcpaRecvResponse(&amInstall.m_pcp, TIMEOUT_NONE);
if (err != e_pcpa_ok) {
pcpaCloseBinary(&amInstall.m_pcp);
pcpaClose(&amInstall.m_pcp);
amInstall = amInstall;
amInstall.m_seq = AM_INSTALL_SEQ_NONE;
amInstall.m_result = AM_INSTALL_STATUS_OK;
if (amInstallDebugLevel > 0) amiDebugLog("pcpaRecvResponse Error!!");
return AM_INSTALL_STATUS_ERR_PCP;
}
return AM_INSTALL_STATUS_OK;
}
AM_INSTALL_STATUS amInstallOpenEx(void) {
e_pcpa_t err =
pcpaOpenClient(&amInstall.m_pcp, "127.0.0.1", amInstall.m_cmdPort, 60000, TIMEOUT_NONE);
if (err == e_pcpa_ok) {
return AM_INSTALL_STATUS_OK;
}
if (err == e_pcpa_timeout_open) {
pcpaClose(&amInstall.m_pcp);
return amInstallOpenEx();
}
if (amInstallDebugLevel > 0) amiDebugLog("pcpaOpenClient() Error(%d)", err);
pcpaCloseBinary(&amInstall.m_pcp);
pcpaClose(&amInstall.m_pcp);
amInstall = amInstall;
amInstall.m_seq = AM_INSTALL_SEQ_NONE;
amInstall.m_result = AM_INSTALL_STATUS_OK;
return AM_INSTALL_STATUS_ERR_NO_SERVER;
}
AM_INSTALL_STATUS amInstallOpen(void) {
e_pcpa_t err = pcpaOpenClient(&amInstall.m_pcp, "127.0.0.1", amInstall.m_cmdPort, 60000, 0);
amInstall = amInstall;
if (err == e_pcpa_ok) {
amInstall.m_seq = AM_INSTALL_SEQ_SEND_REQUEST;
amInstall.m_result = AM_INSTALL_STATUS_BUSY;
return AM_INSTALL_STATUS_OK;
}
if (err == e_pcpa_to) {
amInstall.m_seq = AM_INSTALL_SEQ_BUSY;
amInstall.m_nextSeq = AM_INSTALL_SEQ_SEND_REQUEST;
amInstall.m_result = AM_INSTALL_STATUS_BUSY;
return AM_INSTALL_STATUS_OK;
}
amInstall.m_seq = AM_INSTALL_SEQ_EXIT;
return AM_INSTALL_STATUS_ERR_PCP;
}
AM_INSTALL_STATUS amInstallGetResult(void) {
if (amInstall.m_init == 0) {
amInstall.m_result = AM_INSTALL_STATUS_OK;
return AM_INSTALL_STATUS_ERR_NO_INIT;
}
return amInstall.m_result;
}
AM_INSTALL_STATUS amInstallGetBr(AM_INSTALL_BOOT_RECORD *bootRecord, AM_INSTALL_BLOCKING blocking) {
if (!amInstall.m_init) return AM_INSTALL_STATUS_ERR_NO_INIT;
if (amInstall.m_seq != AM_INSTALL_SEQ_NONE) return AM_INSTALL_STATUS_BUSY;
if (bootRecord == NULL) return AM_INSTALL_STATUS_ERR_INVALID_PARAM;
pcp_send_data_t *send_data = pcpaSetSendPacket(&amInstall.m_pcp, "request", "query_br");
if (send_data == NULL && amInstallDebugLevel > 0)
amiDebugLog("Error: pcpaSetSendPacket return NULL");
amInstall.m_value = bootRecord;
amInstall.m_requestCode = AM_INSTALL_REQUEST_QUERY_BR;
if (blocking == AM_INSTALL_BLOCK) return amInstallSendAndReceiveEx();
return amInstallOpen();
}