From 8dc65b7e4b80d944c3daf552860713295a3e3a00 Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Tue, 26 Sep 2006 11:44:07 +0000 Subject: [PATCH] Made first use of queued messages and fixed several bugs with that --- trunk/cdrskin/cdrskin.c | 99 +++++++++++++++++++++++++++---- trunk/cdrskin/cdrskin_timestamp.h | 2 +- trunk/libburn/init.c | 8 +-- trunk/libburn/libburn.h | 4 +- trunk/libburn/libdax_msgs.c | 41 ++++++++++--- 5 files changed, 125 insertions(+), 29 deletions(-) diff --git a/trunk/cdrskin/cdrskin.c b/trunk/cdrskin/cdrskin.c index a0cec28c..bcd0fc4a 100644 --- a/trunk/cdrskin/cdrskin.c +++ b/trunk/cdrskin/cdrskin.c @@ -1136,6 +1136,8 @@ struct CdrpreskiN { /* to be transfered into skin */ int verbosity; + char queue_severity[81]; + char print_severity[81]; /** Stores eventually given absolute device address before translation */ char raw_device_adr[Cdrskin_adrleN]; @@ -1225,6 +1227,8 @@ int Cdrpreskin_new(struct CdrpreskiN **preskin, int flag) return(-1); o->verbosity= 0; + strcpy(o->queue_severity,"NEVER"); + strcpy(o->print_severity,"SORRY"); o->raw_device_adr[0]= 0; o->device_adr[0]= 0; o->adr_trn= NULL; @@ -1282,15 +1286,32 @@ int Cdrpreskin_destroy(struct CdrpreskiN **preskin, int flag) } +int Cdrpreskin_set_severities(struct CdrpreskiN *preskin, char *queue_severity, + char *print_severity, int flag) +{ + + if(queue_severity!=NULL) + strcpy(preskin->queue_severity,queue_severity); + if(print_severity!=NULL) + strcpy(preskin->print_severity,print_severity); +#ifdef Cdrskin_libburn_has_burn_msgS + burn_msgs_set_severities(preskin->queue_severity, preskin->print_severity, + "cdrskin: "); +#endif + return(1); +} + + int Cdrpreskin_initialize_lib(struct CdrpreskiN *preskin, int flag) { - if(!burn_initialize()) { + int ret; + + ret= burn_initialize(); + if(ret==0) { fprintf(stderr,"cdrskin : FATAL : Initialization of libburn failed\n"); return(0); } -#ifdef Cdrskin_libburn_has_burn_msgS - burn_msgs_set_severities("NEVER","SORRY","cdrskin: "); -#endif + Cdrpreskin_set_severities(preskin,NULL,NULL,0); return(1); } @@ -1761,12 +1782,8 @@ see_cdrskin_eng_html:; } else if(strcmp(argv[i],"-v")==0 || strcmp(argv[i],"-verbose")==0) { (o->verbosity)++; printf("cdrskin: verbosity level : %d\n",o->verbosity); - -#ifdef Cdrskin_libburn_has_burn_msgS if(o->verbosity>=Cdrskin_verbose_debuG) - burn_msgs_set_severities("NEVER","DEBUG","cdrskin: "); -#endif - + Cdrpreskin_set_severities(o,"DEBUG","DEBUG",0); } else if(strcmp(argv[i],"-version")==0) { printf( @@ -1852,7 +1869,7 @@ dev_too_long:; fprintf(stderr, "cdrskin: NOTE : Please inform libburn-hackers@pykix.org about:\n"); fprintf(stderr, - " burn_drive_convert_fs_adr() returned %d\n",lret); + "cdrskin: burn_drive_convert_fs_adr() returned %d\n",lret); } } @@ -4471,6 +4488,7 @@ int Cdrskin_create(struct CdrskiN **o, struct CdrpreskiN **preskin, int *exit_value, int flag) { int ret; + char queue_severity[81],print_severity[81]; struct CdrskiN *skin; *o= NULL; @@ -4503,16 +4521,71 @@ int Cdrskin_create(struct CdrskiN **o, struct CdrpreskiN **preskin, printf("cdrskin: scanning for devices ...\n"); fflush(stdout); - while (!burn_drive_scan(&(skin->drives), &(skin->n_drives))) { + +#define Cdrskin_debug_libdax_msgS /* - if(skin->verbosity>=Cdrskin_verbose_debuG) - ClN(fprintf(stderr,"cdrskin_debug: ... still scanning ...\n")); */ + /* <<< In cdrskin there is not much sense in queueing library messages. + It is done here only for debugging */ +#ifdef Cdrskin_debug_libdax_msgS + + strcpy(queue_severity,skin->preskin->queue_severity); + strcpy(print_severity,skin->preskin->print_severity); + Cdrpreskin_set_severities(skin->preskin,"NOTE","NEVER",0); + +#endif /* Cdrskin_debug_libdax_msgS */ + + while (!burn_drive_scan(&(skin->drives), &(skin->n_drives))) { usleep(20000); /* >>> ??? set a timeout ? */ } + + +#ifdef Cdrskin_debug_libdax_msgS + + Cdrpreskin_set_severities(skin->preskin,queue_severity,print_severity,0); + +#endif /* Cdrskin_debug_libdax_msgS */ + printf("cdrskin: ... scanning for devices done\n"); fflush(stdout); + + +#ifdef Cdrskin_debug_libdax_msgS +#ifdef Cdrskin_libburn_has_burn_msgS + + { + char msg[BURN_MSGS_MESSAGE_LEN],msg_severity[81],filler[81]; + int error_code,os_errno,first,i; + + for(first= 1; ; first= 0) { + ret= burn_msgs_obtain("ALL",&error_code,msg,&os_errno,msg_severity); + if(ret==0) + break; + if(ret<0) { + fprintf(stderr, + "cdrskin: NOTE : Please inform libburn-hackers@pykix.org about:\n"); + fprintf(stderr, + "cdrskin: burn_msgs_obtain() returns %d\n",ret); + break; + } + for(i=0;msg_severity[i]!=0;i++) + filler[i]= ' '; + filler[i]= 0; + if(first) + fprintf(stderr, +"cdrskin: -------------------- Messages from scanning --------------------\n"); + fprintf(stderr,"cdrskin: %s : %s\n",msg_severity,msg); + fprintf(stderr,"cdrskin: %s ( code=%X , os_errno=%d )\n", + filler,error_code,os_errno); + } + if(first==0) + fprintf(stderr, +"cdrskin: ----------------------------------------------------------------\n"); + } +#endif /* Cdrskin_libburn_has_burn_msgS */ +#endif /* Cdrskin_debug_libdax_msgS */ + ex:; return((*exit_value)==0); } diff --git a/trunk/cdrskin/cdrskin_timestamp.h b/trunk/cdrskin/cdrskin_timestamp.h index 716eff0c..bc40e6cd 100644 --- a/trunk/cdrskin/cdrskin_timestamp.h +++ b/trunk/cdrskin/cdrskin_timestamp.h @@ -1 +1 @@ -#define Cdrskin_timestamP "2006.09.25.144506" +#define Cdrskin_timestamP "2006.09.26.114552" diff --git a/trunk/libburn/init.c b/trunk/libburn/init.c index 78fbcf9b..0997ff12 100644 --- a/trunk/libburn/init.c +++ b/trunk/libburn/init.c @@ -44,10 +44,11 @@ int burn_msgs_initialize(void) { int ret; - if(libdax_messenger == NULL) + if(libdax_messenger == NULL) { ret = libdax_msgs_new(&libdax_messenger,0); - if (ret <= 0) - return 0; + if (ret <= 0) + return 0; + } libdax_msgs_set_severities(libdax_messenger, LIBDAX_MSGS_SEV_NEVER, LIBDAX_MSGS_SEV_FATAL, "libburn: ", 0); return 1; @@ -173,7 +174,6 @@ int burn_msgs_obtain(char *minimum_severity, LIBDAX_MSGS_PRIO_ZERO, 0); if (ret <= 0) goto ex; - ret = libdax_msgs_item_get_msg(item, error_code, &textpt, os_errno, 0); if (ret <= 0) goto ex; diff --git a/trunk/libburn/libburn.h b/trunk/libburn/libburn.h index 147c62be..e1b89226 100644 --- a/trunk/libburn/libburn.h +++ b/trunk/libburn/libburn.h @@ -1110,7 +1110,7 @@ int burn_msgs_set_severities(char *queue_severity, char *print_severity, char *print_id); /* ts A60924 : ticket 74 */ -#define BURM_MSGS_MESSAGE_LEN 4096 +#define BURN_MSGS_MESSAGE_LEN 4096 /** Obtain the oldest pending libburn message from the queue which has at least the given minimum_severity. This message and any older message of @@ -1120,7 +1120,7 @@ int burn_msgs_set_severities(char *queue_severity, will discard the whole queue. @param error_code Will become a unique error code as liste in libburn/libdax_msgs.h - @param msg_text Must provide at least BURM_MSGS_MESSAGE_LEN bytes. + @param msg_text Must provide at least BURN_MSGS_MESSAGE_LEN bytes. @param os_errno Will become the eventual errno related to the message @param severity Will become the severity related to the message and should provide at least 80 bytes. diff --git a/trunk/libburn/libdax_msgs.c b/trunk/libburn/libdax_msgs.c index 06535ca5..0e3cc883 100644 --- a/trunk/libburn/libdax_msgs.c +++ b/trunk/libburn/libdax_msgs.c @@ -58,20 +58,38 @@ static int libdax_msgs_item_new(struct libdax_msgs_item **item, } -int libdax_msgs_item_destroy(struct libdax_msgs_item **item, - int flag) +/** Detaches item from its queue and eventually readjusts start, end pointers + of the queue */ +int libdax_msgs_item_unlink(struct libdax_msgs_item *o, + struct libdax_msgs_item **chain_start, + struct libdax_msgs_item **chain_end, int flag) { - struct libdax_msgs_item *o; - - o= *item; - if(o==NULL) - return(0); - if(o->msg_text!=NULL) - free((char *) o->msg_text); if(o->prev!=NULL) o->prev->next= o->next; if(o->next!=NULL) o->next->prev= o->prev; + if(chain_start!=NULL) + if(*chain_start == o) + *chain_start= o->next; + if(chain_end!=NULL) + if(*chain_end == o) + *chain_end= o->prev; + o->next= o->prev= NULL; + return(1); +} + + +int libdax_msgs_item_destroy(struct libdax_msgs_item **item, + int flag) +{ + struct libdax_msgs_item *o; + + o= *item; + if(o==NULL) + return(0); + libdax_msgs_item_unlink(o,NULL,NULL,0); + if(o->msg_text!=NULL) + free((char *) o->msg_text); free((char *) o); *item= NULL; return(1); @@ -314,6 +332,8 @@ int libdax_msgs_submit(struct libdax_msgs *m, int driveno, int error_code, strcpy(item->msg_text,msg_text); } item->os_errno= os_errno; + if(m->oldest==NULL) + m->oldest= item; m->youngest= item; m->count++; libdax_msgs_unlock(m,0); @@ -337,6 +357,7 @@ int libdax_msgs_obtain(struct libdax_msgs *m, struct libdax_msgs_item **item, int ret; struct libdax_msgs_item *im, *next_im= NULL; + *item= NULL; ret= libdax_msgs_lock(m,0); if(ret<=0) return(-1); @@ -345,6 +366,7 @@ int libdax_msgs_obtain(struct libdax_msgs *m, struct libdax_msgs_item **item, next_im= im->next; if(im->severity>=severity) break; + libdax_msgs_item_unlink(im,&(m->oldest),&(m->youngest),0); libdax_msgs_item_destroy(&im,0); /* severity too low: delete */ } if(im==NULL) @@ -354,6 +376,7 @@ int libdax_msgs_obtain(struct libdax_msgs *m, struct libdax_msgs_item **item, } if(im==NULL) {ret= 0; goto ex;} + libdax_msgs_item_unlink(im,&(m->oldest),&(m->youngest),0); *item= im; ret= 1; ex:;