FAQ Search Today's Posts Mark Forums Read
» Video Reviews

» Linux Archive

Linux-archive is a website aiming to archive linux email lists and to make them easily accessible for linux users/developers.


» Sponsor

» Partners

» Sponsor

Go Back   Linux Archive > Redhat > Fedora User

 
 
LinkBack Thread Tools
 
Old 06-09-2011, 10:00 AM
Martin Sivak
 
Default Allow driver disc to be marked as usable for more than one kernel

This patch enables the creator to target more than one version
using <=> operators in the Provides line.

Resolves: rhbz#699745
---
loader/driverdisk.c | 4 ++--
loader/rpmextract.c | 47 +++++++++++++++++++++++++++++++++++++++++++----
loader/rpmextract.h | 4 ++--
3 files changed, 47 insertions(+), 8 deletions(-)

diff --git a/loader/driverdisk.c b/loader/driverdisk.c
index 4b77d03..d8a307c 100644
--- a/loader/driverdisk.c
+++ b/loader/driverdisk.c
@@ -68,7 +68,7 @@ extern uint64_t flags;
* Provides: <dep> = <version>
* we use it to check if kernel-modules = <kernelversion>
*/
-int dlabelProvides(const char* dep, const char* version, void *userptr)
+int dlabelProvides(const char* dep, const char* version, uint32_t sense, void *userptr)
{
char *kernelver = (char*)userptr;

@@ -77,7 +77,7 @@ int dlabelProvides(const char* dep, const char* version, void *userptr)
if (version == NULL)
return -1;

- return strcmp(dep, "kernel-modules") || strcmp(version, kernelver);
+ return strcmp(dep, "kernel-modules") || matchVersions(kernelver, sense, version);
}

/*
diff --git a/loader/rpmextract.c b/loader/rpmextract.c
index fafe46e..fd5cc6b 100644
--- a/loader/rpmextract.c
+++ b/loader/rpmextract.c
@@ -85,6 +85,21 @@ const char * headerGetString(Header h, rpmTag tag)
}

/*
+ *
+ */
+
+int matchVersions(const char *version, uint32_t sense, const char *senseversion)
+{
+ int r = rpmvercmp(version, senseversion);
+
+ if(r<0 && !(sense & RPMSENSE_LESS) return 1;
+ else if(r==0 && !(sense & RPMSENSE_EQUAL) return 1;
+ else if(r>0 && !(sense & RPMSENSE_GREATER) return 1;
+
+ return 0;
+}
+
+/*
* explode source RPM into the current directory
* use filters to skip packages and files we do not need
*/
@@ -154,23 +169,34 @@ int explodeRPM(const char *source,
while (deps) {
struct rpmtd_s tddep;
struct rpmtd_s tdver;
+ struct rpmtd_s tdsense;
+
const char *depname;
const char *depversion;
+ uint32_t depsense;

- if (!headerGet(h, RPMTAG_PROVIDES, &tddep, HEADERGET_MINMEM))
+ if (!headerGet(h, RPMTAG_REQUIRES, &tddep, HEADERGET_MINMEM))
break;

- if (!headerGet(h, RPMTAG_PROVIDEVERSION, &tdver, HEADERGET_MINMEM)){
+ if (!headerGet(h, RPMTAG_REQUIREVERSION, &tdver, HEADERGET_MINMEM)){
+ rpmtdFreeData(&tddep);
+ break;
+ }
+
+ if (!headerGet(h, RPMTAG_REQUIREFLAGS, &tdsense, HEADERGET_MINMEM)){
rpmtdFreeData(&tddep);
+ rpmtdFreeData(&tdver);
break;
}

/* iterator */
while ((depname = rpmtdNextString(&tddep))) {
depversion = rpmtdNextString(&tdver);
- if (deps(depname, depversion, userptr)) {
+ depsense = rpmtdNextUint32(&tdsense);
+ if (deps(depname, depversion, depsense, userptr)) {
rpmtdFreeData(&tddep);
rpmtdFreeData(&tdver);
+ rpmtdFreeData(&tdsense);
Fclose(fdi);
return EXIT_BADDEPS;
}
@@ -178,6 +204,7 @@ int explodeRPM(const char *source,

rpmtdFreeData(&tddep);
rpmtdFreeData(&tdver);
+ rpmtdFreeData(&tdsense);

break;
}
@@ -186,8 +213,12 @@ int explodeRPM(const char *source,
while (provides) {
struct rpmtd_s tddep;
struct rpmtd_s tdver;
+ struct rpmtd_s tdsense;
+
const char *depname;
const char *depversion;
+ uint32_t depsense;
+
int found = 0;

if (!headerGet(h, RPMTAG_PROVIDES, &tddep, HEADERGET_MINMEM))
@@ -198,16 +229,24 @@ int explodeRPM(const char *source,
break;
}

+ if (!headerGet(h, RPMTAG_PROVIDEFLAGS, &tdsense, HEADERGET_MINMEM)){
+ rpmtdFreeData(&tddep);
+ rpmtdFreeData(&tdver);
+ break;
+ }
+
/* iterator */
while ((depname = rpmtdNextString(&tddep))) {
depversion = rpmtdNextString(&tdver);
- if (!provides(depname, depversion, userptr)) {
+ depsense = rpmtdNextUint32(&tdsense);
+ if (!provides(depname, depversion, depsense, userptr)) {
found++;
}
}

rpmtdFreeData(&tddep);
rpmtdFreeData(&tdver);
+ rpmtdFreeData(&tdsense);

if (found<=0){
Fclose(fdi);
diff --git a/loader/rpmextract.h b/loader/rpmextract.h
index 20a5cc8..bf5b65e 100644
--- a/loader/rpmextract.h
+++ b/loader/rpmextract.h
@@ -31,8 +31,8 @@
#define BUFFERSIZE 1024

/* both filter functions return 0 - match, 1 - match not found */
-typedef int (*filterfunc)(const char* name, const struct stat *fstat, void *userptr);
-typedef int (*dependencyfunc)(const char* depname, const char* depversion, void *userptr);
+typedef int (*filterfunc)(const char* name, const struct stat *fstat, const uint32_t sense, void *userptr);
+typedef int (*dependencyfunc)(const char* depname, const char* depversion, const uint32_t sense, void *userptr);

int explodeRPM(const char* file,
filterfunc filter,
--
1.7.4.4

_______________________________________________
Anaconda-devel-list mailing list
Anaconda-devel-list@redhat.com
https://www.redhat.com/mailman/listinfo/anaconda-devel-list
 

Thread Tools




All times are GMT. The time now is 11:52 PM.

VBulletin, Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.
Copyright 2007 - 2008, www.linux-archive.org