svn commit: r306325 - head/usr.bin/mkimg
Marcel Moolenaar
marcel at FreeBSD.org
Sun Sep 25 22:58:01 UTC 2016
Author: marcel
Date: Sun Sep 25 22:57:59 2016
New Revision: 306325
URL: https://svnweb.freebsd.org/changeset/base/306325
Log:
Replace the use of linker sets with constructors for both the
formats and schemes. Formats and schemes are registered at
runtime now, rather than collected at link time.
Modified:
head/usr.bin/mkimg/format.c
head/usr.bin/mkimg/format.h
head/usr.bin/mkimg/mkimg.c
head/usr.bin/mkimg/scheme.c
head/usr.bin/mkimg/scheme.h
Modified: head/usr.bin/mkimg/format.c
==============================================================================
--- head/usr.bin/mkimg/format.c Sun Sep 25 22:17:46 2016 (r306324)
+++ head/usr.bin/mkimg/format.c Sun Sep 25 22:57:59 2016 (r306325)
@@ -28,8 +28,6 @@
__FBSDID("$FreeBSD$");
#include <sys/types.h>
-#include <sys/linker_set.h>
-#include <sys/queue.h>
#include <sys/stat.h>
#include <err.h>
#include <errno.h>
@@ -42,8 +40,24 @@ __FBSDID("$FreeBSD$");
#include "format.h"
#include "mkimg.h"
+static struct mkimg_format *first;
static struct mkimg_format *format;
+struct mkimg_format *
+format_iterate(struct mkimg_format *f)
+{
+
+ return ((f == NULL) ? first : f->next);
+}
+
+void
+format_register(struct mkimg_format *f)
+{
+
+ f->next = first;
+ first = f;
+}
+
int
format_resize(lba_t end)
{
@@ -56,10 +70,10 @@ format_resize(lba_t end)
int
format_select(const char *spec)
{
- struct mkimg_format *f, **iter;
+ struct mkimg_format *f;
- SET_FOREACH(iter, formats) {
- f = *iter;
+ f = NULL;
+ while ((f = format_iterate(f)) != NULL) {
if (strcasecmp(spec, f->name) == 0) {
format = f;
return (0);
Modified: head/usr.bin/mkimg/format.h
==============================================================================
--- head/usr.bin/mkimg/format.h Sun Sep 25 22:17:46 2016 (r306324)
+++ head/usr.bin/mkimg/format.h Sun Sep 25 22:57:59 2016 (r306325)
@@ -29,21 +29,24 @@
#ifndef _MKIMG_FORMAT_H_
#define _MKIMG_FORMAT_H_
-#include <sys/linker_set.h>
-
struct mkimg_format {
+ struct mkimg_format *next;
const char *name;
const char *description;
int (*resize)(lba_t);
int (*write)(int);
};
-SET_DECLARE(formats, struct mkimg_format);
-#define FORMAT_DEFINE(nm) DATA_SET(formats, nm)
+#define FORMAT_DEFINE(nm) \
+static void format_register_##nm(void) __attribute__((constructor)); \
+static void format_register_##nm(void) { format_register(&nm); }
-int format_resize(lba_t);
+struct mkimg_format *format_iterate(struct mkimg_format *);
+void format_register(struct mkimg_format *);
int format_select(const char *);
struct mkimg_format *format_selected(void);
+
+int format_resize(lba_t);
int format_write(int);
#endif /* _MKIMG_FORMAT_H_ */
Modified: head/usr.bin/mkimg/mkimg.c
==============================================================================
--- head/usr.bin/mkimg/mkimg.c Sun Sep 25 22:17:46 2016 (r306324)
+++ head/usr.bin/mkimg/mkimg.c Sun Sep 25 22:57:59 2016 (r306325)
@@ -27,7 +27,6 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-#include <sys/linker_set.h>
#include <sys/queue.h>
#include <sys/stat.h>
#include <sys/types.h>
@@ -77,20 +76,20 @@ u_int blksz = 0;
static void
print_formats(int usage)
{
- struct mkimg_format *f, **f_iter;
+ struct mkimg_format *f;
const char *sep;
if (usage) {
fprintf(stderr, " formats:\n");
- SET_FOREACH(f_iter, formats) {
- f = *f_iter;
+ f = NULL;
+ while ((f = format_iterate(f)) != NULL) {
fprintf(stderr, "\t%s\t- %s\n", f->name,
f->description);
}
} else {
sep = "";
- SET_FOREACH(f_iter, formats) {
- f = *f_iter;
+ f = NULL;
+ while ((f = format_iterate(f)) != NULL) {
printf("%s%s", sep, f->name);
sep = " ";
}
@@ -101,20 +100,20 @@ print_formats(int usage)
static void
print_schemes(int usage)
{
- struct mkimg_scheme *s, **s_iter;
+ struct mkimg_scheme *s;
const char *sep;
if (usage) {
fprintf(stderr, " schemes:\n");
- SET_FOREACH(s_iter, schemes) {
- s = *s_iter;
+ s = NULL;
+ while ((s = scheme_iterate(s)) != NULL) {
fprintf(stderr, "\t%s\t- %s\n", s->name,
s->description);
}
} else {
sep = "";
- SET_FOREACH(s_iter, schemes) {
- s = *s_iter;
+ s = NULL;
+ while ((s = scheme_iterate(s)) != NULL) {
printf("%s%s", sep, s->name);
sep = " ";
}
Modified: head/usr.bin/mkimg/scheme.c
==============================================================================
--- head/usr.bin/mkimg/scheme.c Sun Sep 25 22:17:46 2016 (r306324)
+++ head/usr.bin/mkimg/scheme.c Sun Sep 25 22:57:59 2016 (r306325)
@@ -28,8 +28,6 @@
__FBSDID("$FreeBSD$");
#include <sys/types.h>
-#include <sys/linker_set.h>
-#include <sys/queue.h>
#include <sys/stat.h>
#include <assert.h>
#include <err.h>
@@ -65,6 +63,7 @@ static struct {
{ NULL, ALIAS_NONE } /* Keep last! */
};
+static struct mkimg_scheme *first;
static struct mkimg_scheme *scheme;
static void *bootcode;
@@ -82,13 +81,27 @@ scheme_parse_alias(const char *name)
return (ALIAS_NONE);
}
+struct mkimg_scheme *
+scheme_iterate(struct mkimg_scheme *s)
+{
+
+ return ((s == NULL) ? first : s->next);
+}
+
+void
+scheme_register(struct mkimg_scheme *s)
+{
+ s->next = first;
+ first = s;
+}
+
int
scheme_select(const char *spec)
{
- struct mkimg_scheme *s, **iter;
+ struct mkimg_scheme *s;
- SET_FOREACH(iter, schemes) {
- s = *iter;
+ s = NULL;
+ while ((s = scheme_iterate(s)) != NULL) {
if (strcasecmp(spec, s->name) == 0) {
scheme = s;
return (0);
Modified: head/usr.bin/mkimg/scheme.h
==============================================================================
--- head/usr.bin/mkimg/scheme.h Sun Sep 25 22:17:46 2016 (r306324)
+++ head/usr.bin/mkimg/scheme.h Sun Sep 25 22:57:59 2016 (r306325)
@@ -29,8 +29,6 @@
#ifndef _MKIMG_SCHEME_H_
#define _MKIMG_SCHEME_H_
-#include <sys/linker_set.h>
-
enum alias {
ALIAS_NONE, /* Keep first! */
/* start */
@@ -62,6 +60,7 @@ struct mkimg_alias {
};
struct mkimg_scheme {
+ struct mkimg_scheme *next;
const char *name;
const char *description;
struct mkimg_alias *aliases;
@@ -77,9 +76,12 @@ struct mkimg_scheme {
u_int maxsecsz;
};
-SET_DECLARE(schemes, struct mkimg_scheme);
-#define SCHEME_DEFINE(nm) DATA_SET(schemes, nm)
+#define SCHEME_DEFINE(nm) \
+static void scheme_register_##nm(void) __attribute__((constructor)); \
+static void scheme_register_##nm(void) { scheme_register(&nm); }
+struct mkimg_scheme *scheme_iterate(struct mkimg_scheme *);
+void scheme_register(struct mkimg_scheme *);
int scheme_select(const char *);
struct mkimg_scheme *scheme_selected(void);
More information about the svn-src-all
mailing list