File 0330-bnc457366B-2441640-mofc_instance_migration.patch of Package sblim-sfcb
Index: backend_print.c
===================================================================
RCS file: /cvsroot/sblim/mofc/backend_print.c,v
retrieving revision 1.3
diff -u -r1.3 backend_print.c
--- backend_print.c 27 Oct 2006 13:14:21 -0000 1.3
+++ backend_print.c 16 Dec 2008 23:41:28 -0000
@@ -139,6 +139,10 @@
fprintf(f,"Instance %s ",ie -> class_id);
fprintf(f,"{\n");
+ if (ie->instmig)
+ fprintf(f, " From Instance Import/Migration\n");
+ else
+ fprintf(f, " From MOF\n");
print_property_chain(f,ie -> class_props);
fprintf(f,"}\n");
fprintf(f,"\n");
Index: backend_sfcb.c
===================================================================
RCS file: /cvsroot/sblim/mofc/backend_sfcb.c,v
retrieving revision 1.19
diff -u -r1.19 backend_sfcb.c
--- backend_sfcb.c 28 Aug 2007 08:37:13 -0000 1.19
+++ backend_sfcb.c 16 Dec 2008 23:41:28 -0000
@@ -449,7 +449,11 @@
}
path = mofc_getObjectPath(ce, ie, ns);
- inst = ClInstanceNew(ns, ie->class_id);
+
+ if (ie->instmig)
+ inst = ClInstanceNew(ns, ie->class_id);
+ else
+ inst = ClInstanceNewFromMof(ns, ie->class_id);
while (inst_props) {
if (sfcb_options & BACKEND_VERBOSE) {
Index: mofc.y
===================================================================
RCS file: /cvsroot/sblim/mofc/mofc.y,v
retrieving revision 1.6
diff -u -r1.6 mofc.y
--- mofc.y 3 Jan 2007 11:44:08 -0000 1.6
+++ mofc.y 16 Dec 2008 23:41:28 -0000
@@ -31,7 +31,7 @@
extern class_chain * cls_chain_current;
extern class_chain * inst_chain_current;
extern qual_chain * qual_chain_current;
-
+extern int g_instmig;
%}
@@ -225,7 +225,7 @@
opt_property_initializer_list
'}' ';'
{
- $$ = make_instance(current_symtab,$1,$4,$7);
+ $$ = make_instance(current_symtab,$1,$4,$7,g_instmig);
add_class_list(cls_chain_current,get_class_def(current_symtab,$4));
}
;
Index: mofdecl.h
===================================================================
RCS file: /cvsroot/sblim/mofc/mofdecl.h,v
retrieving revision 1.2
diff -u -r1.2 mofdecl.h
--- mofdecl.h 20 Nov 2005 17:37:05 -0000 1.2
+++ mofdecl.h 16 Dec 2008 23:41:28 -0000
@@ -30,7 +30,7 @@
int yyparse(void);
char * upstrdup( const char *, int );
int init_scanner(char * parsefiles[], int numfiles, const char * includedir,
- const char * extrafile, int verbose);
+ const char * extrafile, const char * instmigfile, int verbose);
void stop_scanner(void);
FILE * try_open_file(const char * filename);
extern int line_number;
Index: mofparse.c
===================================================================
RCS file: /cvsroot/sblim/mofc/mofparse.c,v
retrieving revision 1.8
diff -u -r1.8 mofparse.c
--- mofparse.c 7 Nov 2008 16:51:36 -0000 1.8
+++ mofparse.c 16 Dec 2008 23:41:29 -0000
@@ -24,6 +24,7 @@
#include <symtab.h>
#include <mofdecl.h>
#include <sys/stat.h>
+#include <stdlib.h>
#include "mofc.h"
#include "backend.h"
#ifdef HAVE_CONFIG_H
@@ -42,9 +43,10 @@
static char prefix[3000] = {0};
static char backendopt[300] = {0};
static char namespace[600] = {0};
+static char instmigfile[600] = {0};
static size_t backendopt_used = 0;
static char * inclfile = NULL;
-static char * valid_options = "b:o:I:i:d:n:hvV";
+static char * valid_options = "b:o:I:i:d:n:m:hvV";
extern class_chain * cls_chain_current;
extern class_chain * inst_chain_current;
@@ -67,7 +69,7 @@
strncpy(outfile,optarg,sizeof(outfile));
break;
case 'n':
- strncpy(namespace,optarg,sizeof(outfile));
+ strncpy(namespace,optarg,sizeof(namespace));
break;
case 'd':
strncpy(outdir,optarg,sizeof(outdir));
@@ -91,6 +93,9 @@
case 'i':
inclfile = strdup(optarg);
break;
+ case 'm':
+ strncpy(instmigfile,optarg,sizeof(instmigfile));
+ break;
default:
return -1;
}
@@ -101,7 +106,7 @@
static void usage(const char * name)
{
fprintf(stderr,"usage: %s [-hvV] [-I includepath ...] [-i extrafile] [-o outfile] \
-[-b backendopts] [-d outputdirectory] [-n namespace] filename ... \n",name);
+[-b backendopts] [-d outputdirectory] [-n namespace] [-m instancefile] filename ... \n",name);
}
static void version()
@@ -123,6 +128,7 @@
printf(" -b backendopts backend options, see backend documentation\n");
printf(" -d output directory (recommended when parsing qualifiers and instances, as this creates more than one file)\n");
printf(" -n target namespace, only needed for instances and qualifiers\n");
+ printf(" -m filename file that includes instances for import/migration\n");
}
static int error_occured = 0;
@@ -187,7 +193,7 @@
strcat(prefix, outfile);
}
- if (init_scanner(argv+argidx,argc-argidx,inclpath,inclfile,opt_verbose) != 0 ) {
+ if (init_scanner(argv+argidx,argc-argidx,inclpath,inclfile,instmigfile,opt_verbose) != 0 ) {
return 2;
}
if ( ( yyparse() || error_occured )) {
@@ -195,14 +201,22 @@
fprintf( stderr, "error has occured in %s\n", argv[argidx] );
}
stop_scanner();
+ if (inclfile)
+ free(inclfile);
return 3;
}
if (backend_ptr(cls_chain_current, inst_chain_current, qual_chain_current, prefix, outdir, namespace,
opt_verbose ? BACKEND_VERBOSE : BACKEND_DEFAULT,
backendopt) ) {
fprintf( stderr, "backend error has occured writing %s\n", outfile );
+ stop_scanner();
+ if (inclfile)
+ free(inclfile);
+ return 4;
}
stop_scanner();
+ if (inclfile)
+ free(inclfile);
return 0;
}
Index: mofs.l
===================================================================
RCS file: /cvsroot/sblim/mofc/mofs.l,v
retrieving revision 1.7
diff -u -r1.7 mofs.l
--- mofs.l 7 Nov 2008 16:51:36 -0000 1.7
+++ mofs.l 16 Dec 2008 23:41:29 -0000
@@ -78,6 +78,7 @@
char * upyytext;
char * includepath = NULL;
char * extrainclude = NULL;
+int g_instmig = 0;
typedef struct file_stack_struct {
char * file_name;
@@ -88,9 +89,10 @@
#ifndef SCANDEBUG
class_chain * file_cls;
#endif
+ int instmig;
} file_stack_entry;
file_stack_entry *current_file;
-void push_file(FILE * file_handle, char * filename, int keep_symtab);
+void push_file(FILE * file_handle, char * filename, int keep_symtab, int instmig);
void pop_file();
%}
@@ -179,7 +181,7 @@
}
file_handle = try_open_file( incfilename );
if ( file_handle ) {
- push_file( file_handle, incfilename, 0 );
+ push_file( file_handle, incfilename, 0, 0 );
} else {
fprintf(stderr,"include file %s not found\n",
incfilename);
@@ -203,6 +205,7 @@
fclose(current_file -> file_handle);
}
current_file = current_file -> next_file;
+ g_instmig = current_file -> instmig;
file_name = current_file -> file_name;
line_number = current_file -> line_number;
cls_chain_current = current_file -> file_cls;
@@ -222,7 +225,7 @@
*/
int init_scanner(char * parsefiles[], int numfiles, const char * includedir,
- const char * extrafile, int verbose)
+ const char * extrafile, const char * instmigfile, int verbose)
{
FILE * file_handle;
int i;
@@ -261,20 +264,37 @@
inst_chain_current = calloc(sizeof(class_chain),1);
qual_chain_current = calloc(sizeof(qual_chain),1);
current_file = NULL;
+ /* Must push instanceMigration file prior to other files,
+ so it gets installed last.
+ This will cause any instances that are in both MOF and static
+ (ie previous MOF, then modified), the MOF version will be
+ written first, then the static instance version will be written
+ after, causing an overwrite, so the static instance wins
+ */
+ if (instmigfile && *instmigfile) {
+ file_handle = try_open_file( instmigfile );
+ if (file_handle) {
+ push_file(file_handle, (char *)instmigfile,1,1);
+ } else {
+ fprintf(stderr,"instance import/migration file %s not found\n",
+ instmigfile);
+ return -1;
+ }
+ }
for (i=numfiles-1; i >=0; i--) {
file_handle = fopen(parsefiles[i],"r");
if (file_handle == NULL) {
fprintf(stderr,"could not open %s\n",parsefiles[i]);
return -1;
}
- push_file(file_handle,parsefiles[i],1);
+ push_file(file_handle,parsefiles[i],1,0);
}
includepath = (char*) includedir;
extrainclude = (char*) extrafile;
if (extrainclude) {
file_handle = try_open_file( extrainclude );
if (file_handle) {
- push_file(file_handle, extrainclude,0);
+ push_file(file_handle, extrainclude,0,0);
} else {
fprintf(stderr,"extra file %s not found\n",
extrainclude);
@@ -291,12 +311,13 @@
htdelete( current_symtab );
}
-void push_file( FILE *file_handle, char * filename, int keep_symtab )
+void push_file( FILE *file_handle, char * filename, int keep_symtab, int instmig )
{
file_stack_entry * fse =
calloc( sizeof(file_stack_entry), 1);
fse -> file_handle = file_handle;
fse -> file_name = strdup( filename );
+ fse -> instmig = instmig;
fse -> yybuffer =
yy_create_buffer( file_handle, YY_BUF_SIZE );
if (current_file) {
Index: symtab.c
===================================================================
RCS file: /cvsroot/sblim/mofc/symtab.c,v
retrieving revision 1.11
diff -u -r1.11 symtab.c
--- symtab.c 4 Jan 2007 11:43:08 -0000 1.11
+++ symtab.c 16 Dec 2008 23:41:29 -0000
@@ -391,12 +391,14 @@
class_entry * make_instance( hashentry * he,
qual_chain * qu_ch,
const char * name,
- prop_or_method_list * pom_li)
+ prop_or_method_list * pom_li,
+ int instmig)
{
class_entry * ce = malloc(sizeof(class_entry));
prop_chain * props;
ce -> class_id = strdup(name);
+ ce -> instmig = instmig;
if (pom_li) {
ce -> class_props = pom_li -> pom_props;
}
@@ -650,7 +652,7 @@
prop_chain * props = e->class_props;
while (props) {
- if(strcmp(props->prop_id, prop_id))
+ if(strcasecmp(props->prop_id, prop_id))
props = props->prop_next;
else
return props;
Index: symtab.h
===================================================================
RCS file: /cvsroot/sblim/mofc/symtab.h,v
retrieving revision 1.6
diff -u -r1.6 symtab.h
--- symtab.h 3 Jan 2007 11:44:08 -0000 1.6
+++ symtab.h 16 Dec 2008 23:41:29 -0000
@@ -133,7 +133,8 @@
struct class_struct * class_parent;
qual_chain * class_quals;
prop_chain * class_props;
- method_chain * class_methods;
+ method_chain * class_methods;
+ int instmig;
};
typedef struct symtab_struct {
@@ -210,7 +211,8 @@
class_entry * make_instance(hashentry * he,
qual_chain * qu_ch,
const char * name,
- prop_or_method_list * pom_li);
+ prop_or_method_list * pom_li,
+ int instmig);
prop_chain * check_for_prop(class_entry * e, char * prop_id);
int check_for_keys(class_entry * ce, class_entry * ie);
class_entry * get_class_def_for_instance(class_entry * ie);