Files
m241Neelima/vxworks-6.9/target/src/boot/bootTftpLoad.c
T
2026-07-30 11:19:44 +05:30

168 lines
4.4 KiB
C

/* bootTftpLoad.c - Boot loader application TFTP file load support component */
/*
* Copyright (c) 2005, 2007, 2009-2010, 2014 Wind River Systems, Inc.
*
* The right to copy, distribute, modify or otherwise make use
* of this software may be licensed only pursuant to the terms
* of an applicable Wind River license agreement.
*/
/*
modification history
--------------------
07jul14,p_x Fix overrun issue in dataBuf[num]
01e,02mar10,pgh Save ELF file class ELF32 or ELF64
01d,11dec09,pgh 64-bit conversion
01c,29apr09,pgh Update documentation.
01d,21apr09,hps LP64: move drv_val_t to private header iosLibP.h
01c,14apr09,hps LP64: iosFdValue now returns drv_val_t
01b,06feb07,jmt Add bootAppPrintf to optimize size
01a,11jul05,jmt written
*/
/*
DESCRIPTION
This module contains the support routines for the VxWorks bootrom loader application
TFTP file load component. This module is added to the boot loader application when
the INCLUDE_BOOT_TFTP_LOADER component is included. This module consists of
an initialization routine for the TFTP file load component, and the TFTP file
load handler. The TFTP file load handler is installed by initializing the
bootTftpLoaderFcn function pointer with the address of the TFTP file load
handler. The bootTftpLoaderFcn function pointer is executed by the
bootNetLoad.c module when this routine pointer is not NULL.
INCLUDE FILES: bootApp.h vxWorks.h
*/
/* includes */
#include <vxWorks.h>
#include <bootLib.h>
#include <bootLoadLib.h>
#include <ioLib.h>
#include <iosLib.h>
#include <private/iosLibP.h>
#include <tftpLib.h>
#include <bootApp.h>
#include <bootNetLoad.h>
/* defines */
#define DATA_BUF_SIZE 512
/* typedefs */
/* globals */
extern bootNetLoadPrototype * bootTftpLoaderFcn;
extern int bootElfClass; /* ELF file class: ELF32 or ELF64 */
/* forward declarations */
void bootTftpLoadInit(void);
LOCAL STATUS bootTftpLoad (char *hostName, char *fileName, char *usr,
char *passwd, void **pEntry);
/*******************************************************************************
*
* bootTftpLoadInit - Initialize TFTP file load component
*
* This routine initializes the boot loader application TFTP file load
* component, by registering the TFTP file load handler with the bootNetLoad.c
* module.
*
* RETURNS: N/A
*
* ERRNO: N/A
*
* \NOMANUAL
*/
void bootTftpLoadInit()
{
/* setup TFTP Loader function pointer */
bootTftpLoaderFcn = (bootNetLoadPrototype *) bootTftpLoad;
}
/*******************************************************************************
*
* bootTftpLoad - Load a file from a remote host via TFTP.
*
* This routine is the TFTP file load handler that is registered with the boot
* loader application to load files from a remote host machine via the TFTP
* protocol. This routine uses the TFTP protocol to load the file specified
* by the boot parameters from the remote host machine specified by the boot
* parameters.
*
* RETURNS:
* OK if the file is loaded via TFTP
* ERROR if the file does not exist on the remote host, or the transfer failed
*
* ERRNO: N/A
*
* \NOMANUAL
*/
LOCAL STATUS bootTftpLoad
(
char * hostName,
char * fileName,
char * usr,
char * passwd,
void ** pEntry
)
{
STATUS rtv = OK;
int fd;
int errFd; /* for receiving standard error messages from Unix */
int num;
char dataBuf [DATA_BUF_SIZE];
rtv = tftpXfer (hostName, 0, fileName, "get", "binary", &fd, &errFd);
if (rtv == ERROR)
{
bootAppPrintf("TFTP transfer failed\n",0,0,0,0,0,0);
return (ERROR);
}
rtv = bootLoadModule (fd, pEntry, &bootElfClass);
if (rtv != OK)
{
bootAppPrintf("File load failed\n",0,0,0,0,0,0);
goto readErr;
}
/*
* Discard any remaining data from the TFTP server.
*/
while (read (fd, dataBuf, sizeof (dataBuf)) > 0)
{
}
close (fd);
readErr:
/*
* Get and display any error messages from TFTP server.
*/
num = (int)read (errFd, dataBuf, sizeof (dataBuf));
if (num > 0)
{
int dataBufSize = sizeof (dataBuf);
if (num < dataBufSize)
dataBuf[num] = '\0';
else
dataBuf[dataBufSize - 1] = '\0';
bootAppPrintf("TFTP error: %s\n",(_Vx_usr_arg_t)dataBuf,0,0,0,0,0);
}
close (errFd);
return (rtv);
}