support for setopt key value gathering

This commit is contained in:
Priyesh Padmavilasom 2015-11-23 00:01:19 +00:00
parent 849222fa5a
commit 075d3c1dbb
9 changed files with 167 additions and 1 deletions

View File

@ -1014,6 +1014,7 @@ TDNFFreeCmdArgs(
}
TDNF_SAFE_FREE_MEMORY(pCmdArgs->pszInstallRoot);
TDNF_SAFE_FREE_MEMORY(pCmdArgs->pSetOpt);
TDNF_SAFE_FREE_MEMORY(pCmdArgs);
}
@ -1023,3 +1024,19 @@ TDNFGetVersion(
{
return PACKAGE_VERSION;
}
void
TDNFFreeCmdOpt(
PTDNF_CMD_OPT pCmdOpt
)
{
PTDNF_CMD_OPT pCmdOptTemp = NULL;
while(pCmdOpt)
{
TDNF_SAFE_FREE_MEMORY(pCmdOpt->pszOptName);
TDNF_SAFE_FREE_MEMORY(pCmdOpt->pszOptValue);
pCmdOptTemp = pCmdOpt->pNext;
TDNF_SAFE_FREE_MEMORY(pCmdOpt);
pCmdOpt = pCmdOptTemp;
}
}

View File

@ -622,6 +622,11 @@ TDNFFreeMemory(
void* pMemory
);
void
TDNFFreeCmdOpt(
PTDNF_CMD_OPT pCmdOpt
);
//search.c
uint32_t
TDNFQueryTermsHelper(

View File

@ -255,6 +255,11 @@ TDNFFreeUpdateInfoSummary(
PTDNF_UPDATEINFO_SUMMARY pSummary
);
void
TDNFFreeCmdOpt(
PTDNF_CMD_OPT pCmdOpt
);
#ifdef __cplusplus
}
#endif

View File

@ -170,6 +170,13 @@ typedef struct _TDNF_SOLVED_PKG_INFO
char** ppszPkgsNotResolved;
}TDNF_SOLVED_PKG_INFO, *PTDNF_SOLVED_PKG_INFO;
typedef struct _TDNF_CMD_OPT
{
char* pszOptName;
char* pszOptValue;
struct _TDNF_CMD_OPT* pNext;
}TDNF_CMD_OPT, *PTDNF_CMD_OPT;
typedef struct _TDNF_CMD_ARGS
{
//Represent options in the dnf cmd line.
@ -199,6 +206,7 @@ typedef struct _TDNF_CMD_ARGS
char** ppszEnabledRepos;
//Disabled repositories
char** ppszDisabledRepos;
PTDNF_CMD_OPT pSetOpt;
}TDNF_CMD_ARGS, *PTDNF_CMD_ARGS;
typedef struct _TDNF_CONF

View File

@ -12,6 +12,7 @@ tdnf_SOURCES = \
parselistargs.c \
parserepolistargs.c \
parseupdateinfo.c \
setopt.c \
updateinfocmd.c
tdnf_LDADD = \
$(top_builddir)/client/libtdnfclient.la

View File

@ -32,6 +32,7 @@
#define ERROR_TDNF_CLI_OPTION_NAME_INVALID (ERROR_TDNF_CLI_BASE + 8)
#define ERROR_TDNF_CLI_OPTION_ARG_REQUIRED (ERROR_TDNF_CLI_BASE + 9)
#define ERROR_TDNF_CLI_OPTION_ARG_UNEXPECTED (ERROR_TDNF_CLI_BASE + 10)
#define ERROR_TDNF_CLI_SETOPT_NO_EQUALS (ERROR_TDNF_CLI_BASE + 11)
#define IsNullOrEmptyString(str) (!(str) || !(*str))
@ -67,4 +68,5 @@ typedef uint32_t (*PFN_CMD)(PTDNF, PTDNF_CMD_ARGS);
{ERROR_TDNF_CLI_OPTION_ARG_UNEXPECTED, "ERROR_TDNF_CLI_OPTION_ARG_UNEXPECTED", "Command line error: argument was unexpected."}, \
{ERROR_TDNF_CLI_CHECKLOCAL_EXPECT_DIR, "ERROR_TDNF_CLI_CHECKLOCAL_EXPECT_DIR", "check-local requires path to rpm directory as a parameter"}, \
{ERROR_TDNF_CLI_PROVIDES_EXPECT_ARG, "ERROR_TDNF_CLI_PROVIDES_EXPECT_ARG", "Need an item to match."}, \
{ERROR_TDNF_CLI_SETOPT_NO_EQUALS, "ERROR_TDNF_CLI_SETOPT_NO_EQUALS", "Missing equal sign in setopt argument. setopt requires an argument of the form key=value."}, \
};

View File

@ -340,7 +340,8 @@ ParseOption(
dwError = ERROR_TDNF_CLI_OPTION_ARG_REQUIRED;
BAIL_ON_CLI_ERROR(dwError);
}
fprintf(stdout, "setopt: %s\n", optarg);
dwError = AddSetOpt(pCmdArgs, optarg);
BAIL_ON_CLI_ERROR(dwError);
}
cleanup:
return dwError;

View File

@ -380,3 +380,16 @@ void
TDNFFreeListArgs(
PTDNF_LIST_ARGS pListArgs
);
//setopt.c
uint32_t
AddSetOpt(
PTDNF_CMD_ARGS pCmdArgs,
const char* pszOptArg
);
uint32_t
GetOptionAndValue(
const char* pszOptArg,
PTDNF_CMD_OPT* ppCmdOpt
);

114
tools/cli/setopt.c Normal file
View File

@ -0,0 +1,114 @@
/*
* Copyright (C) 2015 VMware, Inc. All Rights Reserved.
*
* Licensed under the GNU General Public License v2 (the "License");
* you may not use this file except in compliance with the License. The terms
* of the License are located in the COPYING file of this distribution.
*/
/*
* Module : setopt.c
*
* Abstract :
*
* tdnf
*
* command line tool
*
* Authors : Priyesh Padmavilasom (ppadmavilasom@vmware.com)
*
*/
#include "includes.h"
uint32_t
AddSetOpt(
PTDNF_CMD_ARGS pCmdArgs,
const char* pszOptArg
)
{
uint32_t dwError = 0;
PTDNF_CMD_OPT pCmdOpt = NULL;
PTDNF_CMD_OPT pCmdOptEnd = NULL;
if(!pCmdArgs || IsNullOrEmptyString(pszOptArg))
{
dwError = ERROR_TDNF_CLI_INVALID_ARGUMENT;
BAIL_ON_CLI_ERROR(dwError);
}
dwError = GetOptionAndValue(pszOptArg, &pCmdOpt);
BAIL_ON_CLI_ERROR(dwError);
pCmdOptEnd = pCmdArgs->pSetOpt;
if(!pCmdOptEnd)
{
pCmdArgs->pSetOpt = pCmdOpt;
}
else
{
while(pCmdOptEnd->pNext)
{
pCmdOptEnd = pCmdOptEnd->pNext;
}
pCmdOptEnd->pNext = pCmdOpt;
}
cleanup:
return dwError;
error:
goto cleanup;
}
uint32_t
GetOptionAndValue(
const char* pszOptArg,
PTDNF_CMD_OPT* ppCmdOpt
)
{
uint32_t dwError = 0;
const char* EQUAL_SIGN = "=";
const char* pszIndex = NULL;
PTDNF_CMD_OPT pCmdOpt = NULL;
int nEqualsPos = -1;
if(IsNullOrEmptyString(pszOptArg) || !ppCmdOpt)
{
dwError = ERROR_TDNF_CLI_INVALID_ARGUMENT;
BAIL_ON_CLI_ERROR(dwError);
}
pszIndex = strstr(pszOptArg, EQUAL_SIGN);
if(!pszIndex)
{
dwError = ERROR_TDNF_CLI_SETOPT_NO_EQUALS;
BAIL_ON_CLI_ERROR(dwError);
}
dwError = TDNFAllocateMemory(sizeof(TDNF_CMD_OPT), (void**)&pCmdOpt);
BAIL_ON_CLI_ERROR(dwError);
dwError = TDNFAllocateString(pszOptArg, &pCmdOpt->pszOptName);
BAIL_ON_CLI_ERROR(dwError);
nEqualsPos = pszIndex - pszOptArg;
pCmdOpt->pszOptName[nEqualsPos] = '\0';
dwError = TDNFAllocateString(pszOptArg+nEqualsPos+1, &pCmdOpt->pszOptValue);
BAIL_ON_CLI_ERROR(dwError);
*ppCmdOpt = pCmdOpt;
cleanup:
return dwError;
error:
if(ppCmdOpt)
{
*ppCmdOpt = NULL;
}
if(pCmdOpt)
{
TDNFFreeCmdOpt(pCmdOpt);
}
goto cleanup;
}