CmsRet AEI_writeDualPartition(char *imagePtr, UINT32 imageLen, void *msgHandle, int partition) { CmsImageFormat format; CmsRet ret; if ((format = cmsImg_validateImage(imagePtr, imageLen, msgHandle)) == CMS_IMAGE_FORMAT_INVALID) { ret = CMSRET_INVALID_IMAGE; } #if defined(AEI_VDSL_CUSTOMER_CENTURYLINK) else if(format == CMS_IMAGE_FORMAT_CORRUPTED) { ret = CMSRET_INVALID_IMAGE; } #endif else if(format == CMS_IMAGE_FORMAT_FLASH) { ret = devCtl_boardIoctl(BOARD_IOCTL_PARTITION_WRITE, partition, imagePtr, imageLen-TOKEN_LEN, 0, 0); } return ret; }
void do_fwUpdate(void) { int byteRd = 0; char *curPtr = NULL; unsigned int totalAllocatedSize = 0; char *buffer; int max; fd_set rfds; struct timeval tv; UBOOL8 isConfigFile; /* reset all of our globals before starting another download */ imageFormat = CMS_IMAGE_FORMAT_INVALID; if (imagePtr) free(imagePtr); imagePtr = NULL; uploadSize = 0; if (dataconn()) return; alarm(0); if ((buffer = malloc(xfer_bufsize)) == NULL) { displayMessage(UPLOAD_FAIL_NO_MEM); return; } max = (sock > fileno(stdin) ? sock : fileno(stdin)) + 1; for (;;) { FD_ZERO(&rfds); FD_SET(sock, &rfds); FD_SET(fileno(stdin), &rfds); tv.tv_sec = data_timeout; tv.tv_usec = 0; if (!select(max, &rfds, NULL, NULL, &tv)) { close(sock); control_printf(SL_FAILURE, "426 Kicked due to data transmission timeout."); if (imagePtr) free(imagePtr); free(buffer); displayMessage(UPLOAD_FAIL_FTP); return; // exit ? } if (!((byteRd = recv(sock, buffer, xfer_bufsize, 0)))) break; if (curPtr == NULL) { // Also look in tftpd.c, which does about the same thing isConfigFile = cmsImg_isConfigFileLikely(buffer); cmsLog_debug("isConfigFile = %d", isConfigFile); if (isConfigFile) { totalAllocatedSize = cmsImg_getConfigFlashSize(); } else { totalAllocatedSize = cmsImg_getImageFlashSize() + cmsImg_getBroadcomImageTagSize(); // let smd know that we are about to start a big download cmsImg_sendLoadStartingMsg(msgHandle, connIfName); } if ((curPtr = (char *) malloc(totalAllocatedSize)) == NULL) { cmsLog_error("Not enough memory (%d bytes needed)", totalAllocatedSize); free(buffer); cmsImg_sendLoadDoneMsg(msgHandle); return; } printf("%d bytes allocated for image\n", totalAllocatedSize); imagePtr = curPtr; } if (uploadSize + byteRd < totalAllocatedSize) { memcpy(curPtr, buffer, byteRd); curPtr += byteRd; uploadSize += byteRd; } else { printf("Image could not fit into %d byte buffer.\n", totalAllocatedSize); free(buffer); free(imagePtr); imagePtr = NULL; cmsImg_sendLoadDoneMsg(msgHandle); return; } } // end for loop to read in complete image free(buffer); /* * Now we have the entire image. Validate it. */ if ((imageFormat = cmsImg_validateImage(imagePtr, uploadSize, msgHandle)) == CMS_IMAGE_FORMAT_INVALID) { displayMessage(UPLOAD_FAIL_ILLEGAL_IMAGE); free(imagePtr); imagePtr = NULL; cmsImg_sendLoadDoneMsg(msgHandle); } else { printf("Image validated, size=%u format=%d, waiting for quit before flashing.\n", uploadSize, imageFormat); displayMessage(UPLOAD_OK); // flash image will be done when user types bye or OK } close(sock); // this tells the ftp client that the transfer is complete alarm(control_timeout); }