xorriso  1.5.4.pl02
About: GNU xorriso creates, loads, manipulates and writes ISO 9660 filesystem images with Rock Ridge extensions. It is suitable for incremental data backup and for production of bootable ISO 9660 images. GNU xorriso is a statical compilation of the libraries libburn, libisofs, libisoburn, and libjte.
  Fossies Dox: xorriso-1.5.4.pl02.tar.gz  ("unofficial" and yet experimental doxygen-generated source code documentation)  

libiso_msgs.c
Go to the documentation of this file.
1 
2 /* libiso_msgs (generated from libdax_msgs : Fri Feb 22 19:42:52 CET 2008)
3  Message handling facility of libisofs.
4  Copyright (C) 2006 - 2016 Thomas Schmitt <scdbackup@gmx.net>,
5 
6  This file is part of the libisofs project; you can redistribute it and/or
7  modify it under the terms of the GNU General Public License version 2
8  or later as published by the Free Software Foundation.
9  See COPYING file for details.
10 
11 */
12 
13 #ifdef HAVE_CONFIG_H
14 #include "../config.h"
15 #endif
16 
17 #include <stdio.h>
18 #include <sys/types.h>
19 #include <unistd.h>
20 #include <string.h>
21 #include <stdlib.h>
22 #include <errno.h>
23 #include <sys/time.h>
24 
25 /* Only this single source module is entitled to do this */
26 #define LIBISO_MSGS_H_INTERNAL 1
27 
28 /* All participants in the messaging system must do this */
29 #include "libiso_msgs.h"
30 
31 
32 /* ----------------------------- libiso_msgs_item ------------------------- */
33 
34 
35 static int libiso_msgs_item_new(struct libiso_msgs_item **item,
36  struct libiso_msgs_item *link, int flag)
37 {
38  int ret;
39  struct libiso_msgs_item *o;
40  struct timeval tv;
41 
42  (*item)= o=
43  (struct libiso_msgs_item *) malloc(sizeof(struct libiso_msgs_item));
44  if(o==NULL)
45  return(-1);
46  o->timestamp= 0.0;
47  ret= gettimeofday(&tv, NULL);
48  if(ret==0)
49  o->timestamp= tv.tv_sec+0.000001*tv.tv_usec;
50  o->process_id= getpid();
51  o->origin= -1;
52  o->severity= LIBISO_MSGS_SEV_ALL;
53  o->priority= LIBISO_MSGS_PRIO_ZERO;
54  o->error_code= 0;
55  o->msg_text= NULL;
56  o->os_errno= 0;
57  o->prev= link;
58  o->next= NULL;
59  if(link!=NULL) {
60  if(link->next!=NULL) {
61  link->next->prev= o;
62  o->next= link->next;
63  }
64  link->next= o;
65  }
66  return(1);
67 }
68 
69 
70 /** Detaches item from its queue and eventually readjusts start, end pointers
71  of the queue */
72 int libiso_msgs_item_unlink(struct libiso_msgs_item *o,
73  struct libiso_msgs_item **chain_start,
74  struct libiso_msgs_item **chain_end, int flag)
75 {
76  if(o->prev!=NULL)
77  o->prev->next= o->next;
78  if(o->next!=NULL)
79  o->next->prev= o->prev;
80  if(chain_start!=NULL)
81  if(*chain_start == o)
82  *chain_start= o->next;
83  if(chain_end!=NULL)
84  if(*chain_end == o)
85  *chain_end= o->prev;
86  o->next= o->prev= NULL;
87  return(1);
88 }
89 
90 
91 int libiso_msgs_item_destroy(struct libiso_msgs_item **item,
92  int flag)
93 {
94  struct libiso_msgs_item *o;
95 
96  o= *item;
97  if(o==NULL)
98  return(0);
99  libiso_msgs_item_unlink(o,NULL,NULL,0);
100  if(o->msg_text!=NULL)
101  free((char *) o->msg_text);
102  free((char *) o);
103  *item= NULL;
104  return(1);
105 }
106 
107 
108 int libiso_msgs_item_get_msg(struct libiso_msgs_item *item,
109  int *error_code, char **msg_text, int *os_errno,
110  int flag)
111 {
112  *error_code= item->error_code;
113  *msg_text= item->msg_text;
114  *os_errno= item->os_errno;
115  return(1);
116 }
117 
118 
119 int libiso_msgs_item_get_origin(struct libiso_msgs_item *item,
120  double *timestamp, pid_t *process_id, int *origin,
121  int flag)
122 {
123  *timestamp= item->timestamp;
124  *process_id= item->process_id;
125  *origin= item->origin;
126  return(1);
127 }
128 
129 
130 int libiso_msgs_item_get_rank(struct libiso_msgs_item *item,
131  int *severity, int *priority, int flag)
132 {
133  *severity= item->severity;
134  *priority= item->priority;
135  return(1);
136 }
137 
138 
139 /* ------------------------------- libiso_msgs ---------------------------- */
140 
141 
142 int libiso_msgs_new(struct libiso_msgs **m, int flag)
143 {
144  struct libiso_msgs *o;
145 
146  (*m)= o= (struct libiso_msgs *) malloc(sizeof(struct libiso_msgs));
147  if(o==NULL)
148  return(-1);
149  o->refcount= 1;
150  o->oldest= NULL;
151  o->youngest= NULL;
152  o->count= 0;
153  o->queue_severity= LIBISO_MSGS_SEV_ALL;
154  o->print_severity= LIBISO_MSGS_SEV_NEVER;
155  strcpy(o->print_id,"libiso: ");
156 
157 #ifndef LIBISO_MSGS_SINGLE_THREADED
158  pthread_mutex_init(&(o->lock_mutex),NULL);
159 #endif
160 
161  return(1);
162 }
163 
164 
165 static int libiso_msgs_lock(struct libiso_msgs *m, int flag)
166 {
167 
168 #ifndef LIBISO_MSGS_SINGLE_THREADED
169  int ret;
170 
171  ret= pthread_mutex_lock(&(m->lock_mutex));
172  if(ret!=0)
173  return(0);
174 #endif
175 
176  return(1);
177 }
178 
179 
180 static int libiso_msgs_unlock(struct libiso_msgs *m, int flag)
181 {
182 
183 #ifndef LIBISO_MSGS_SINGLE_THREADED
184  int ret;
185 
186  ret= pthread_mutex_unlock(&(m->lock_mutex));
187  if(ret!=0)
188  return(0);
189 #endif
190 
191  return(1);
192 }
193 
194 
195 int libiso_msgs_destroy(struct libiso_msgs **m, int flag)
196 {
197  struct libiso_msgs *o;
198  struct libiso_msgs_item *item, *next_item;
199 
200  o= *m;
201  if(o==NULL)
202  return(0);
203  if(o->refcount > 1) {
204  if(libiso_msgs_lock(*m,0)<=0)
205  return(-1);
206  o->refcount--;
207  libiso_msgs_unlock(*m,0);
208  *m= NULL;
209  return(1);
210  }
211 
212 #ifndef LIBISO_MSGS_SINGLE_THREADED
213  if(pthread_mutex_destroy(&(o->lock_mutex))!=0) {
214  pthread_mutex_unlock(&(o->lock_mutex));
215  pthread_mutex_destroy(&(o->lock_mutex));
216  }
217 #endif
218 
219  for(item= o->oldest; item!=NULL; item= next_item) {
220  next_item= item->next;
221  libiso_msgs_item_destroy(&item,0);
222  }
223  free((char *) o);
224  *m= NULL;
225  return(1);
226 }
227 
228 
229 int libiso_msgs_refer(struct libiso_msgs **pt, struct libiso_msgs *m, int flag)
230 {
231  if(libiso_msgs_lock(m,0)<=0)
232  return(0);
233  m->refcount++;
234  *pt= m;
235  libiso_msgs_unlock(m,0);
236  return(1);
237 }
238 
239 
240 int libiso_msgs_set_severities(struct libiso_msgs *m, int queue_severity,
241  int print_severity, char *print_id, int flag)
242 {
243  if(libiso_msgs_lock(m,0)<=0)
244  return(0);
245  m->queue_severity= queue_severity;
246  m->print_severity= print_severity;
247  strncpy(m->print_id,print_id,80);
248  m->print_id[80]= 0;
249  libiso_msgs_unlock(m,0);
250  return(1);
251 }
252 
253 
254 int libiso_msgs__text_to_sev(char *severity_name, int *severity,
255  int flag)
256 {
257  if(strncmp(severity_name,"NEVER",5)==0)
258  *severity= LIBISO_MSGS_SEV_NEVER;
259  else if(strncmp(severity_name,"ABORT",5)==0)
260  *severity= LIBISO_MSGS_SEV_ABORT;
261  else if(strncmp(severity_name,"FATAL",5)==0)
262  *severity= LIBISO_MSGS_SEV_FATAL;
263  else if(strncmp(severity_name,"FAILURE",7)==0)
264  *severity= LIBISO_MSGS_SEV_FAILURE;
265  else if(strncmp(severity_name,"MISHAP",6)==0)
266  *severity= LIBISO_MSGS_SEV_MISHAP;
267  else if(strncmp(severity_name,"SORRY",5)==0)
268  *severity= LIBISO_MSGS_SEV_SORRY;
269  else if(strncmp(severity_name,"WARNING",7)==0)
270  *severity= LIBISO_MSGS_SEV_WARNING;
271  else if(strncmp(severity_name,"HINT",4)==0)
272  *severity= LIBISO_MSGS_SEV_HINT;
273  else if(strncmp(severity_name,"NOTE",4)==0)
274  *severity= LIBISO_MSGS_SEV_NOTE;
275  else if(strncmp(severity_name,"UPDATE",6)==0)
276  *severity= LIBISO_MSGS_SEV_UPDATE;
277  else if(strncmp(severity_name,"DEBUG",5)==0)
278  *severity= LIBISO_MSGS_SEV_DEBUG;
279  else if(strncmp(severity_name,"ERRFILE",7)==0)
280  *severity= LIBISO_MSGS_SEV_ERRFILE;
281  else if(strncmp(severity_name,"ALL",3)==0)
282  *severity= LIBISO_MSGS_SEV_ALL;
283  else {
284  *severity= LIBISO_MSGS_SEV_ALL;
285  return(0);
286  }
287  return(1);
288 }
289 
290 
291 int libiso_msgs__sev_to_text(int severity, char **severity_name,
292  int flag)
293 {
294  if(flag&1) {
295  *severity_name= "ALL ERRFILE DEBUG UPDATE NOTE HINT WARNING SORRY MISHAP FAILURE FATAL ABORT NEVER";
296  return(1);
297  }
298  *severity_name= "";
299  if(severity>=LIBISO_MSGS_SEV_NEVER)
300  *severity_name= "NEVER";
301  else if(severity>=LIBISO_MSGS_SEV_ABORT)
302  *severity_name= "ABORT";
303  else if(severity>=LIBISO_MSGS_SEV_FATAL)
304  *severity_name= "FATAL";
305  else if(severity>=LIBISO_MSGS_SEV_FAILURE)
306  *severity_name= "FAILURE";
307  else if(severity>=LIBISO_MSGS_SEV_MISHAP)
308  *severity_name= "MISHAP";
309  else if(severity>=LIBISO_MSGS_SEV_SORRY)
310  *severity_name= "SORRY";
311  else if(severity>=LIBISO_MSGS_SEV_WARNING)
312  *severity_name= "WARNING";
313  else if(severity>=LIBISO_MSGS_SEV_HINT)
314  *severity_name= "HINT";
315  else if(severity>=LIBISO_MSGS_SEV_NOTE)
316  *severity_name= "NOTE";
317  else if(severity>=LIBISO_MSGS_SEV_UPDATE)
318  *severity_name= "UPDATE";
319  else if(severity>=LIBISO_MSGS_SEV_DEBUG)
320  *severity_name= "DEBUG";
321  else if(severity>=LIBISO_MSGS_SEV_ERRFILE)
322  *severity_name= "ERRFILE";
323  else if(severity>=LIBISO_MSGS_SEV_ALL)
324  *severity_name= "ALL";
325  else {
326  *severity_name= "";
327  return(0);
328  }
329  return(1);
330 }
331 
332 
333 int libiso_msgs_submit(struct libiso_msgs *m, int origin, int error_code,
334  int severity, int priority, char *msg_text,
335  int os_errno, int flag)
336 {
337  int ret;
338  char *textpt,*sev_name,sev_text[81];
339  struct libiso_msgs_item *item= NULL;
340 
341  if(severity >= m->print_severity) {
342  if(msg_text==NULL)
343  textpt= "";
344  else
345  textpt= msg_text;
346  sev_text[0]= 0;
347  ret= libiso_msgs__sev_to_text(severity,&sev_name,0);
348  if(ret>0)
349  sprintf(sev_text,"%s : ",sev_name);
350 
351  fprintf(stderr,"%s%s%s\n",m->print_id,sev_text,textpt);
352  if(os_errno!=0) {
353  ret= libiso_msgs_lock(m,0);
354  if(ret<=0)
355  return(-1);
356  fprintf(stderr,"%s( Most recent system error: %d '%s' )\n",
357  m->print_id,os_errno,strerror(os_errno));
358  libiso_msgs_unlock(m,0);
359  }
360 
361  }
362  if(severity < m->queue_severity)
363  return(0);
364 
365  ret= libiso_msgs_lock(m,0);
366  if(ret<=0)
367  return(-1);
368  ret= libiso_msgs_item_new(&item,m->youngest,0);
369  if(ret<=0)
370  goto failed;
371  item->origin= origin;
372  item->error_code= error_code;
373  item->severity= severity;
374  item->priority= priority;
375  if(msg_text!=NULL) {
376  item->msg_text= malloc(strlen(msg_text)+1);
377  if(item->msg_text==NULL)
378  goto failed;
379  strcpy(item->msg_text,msg_text);
380  }
381  item->os_errno= os_errno;
382  if(m->oldest==NULL)
383  m->oldest= item;
384  m->youngest= item;
385  m->count++;
386  libiso_msgs_unlock(m,0);
387 
388 /*
389 fprintf(stderr,"libiso_experimental: message submitted to queue (now %d)\n",
390  m->count);
391 */
392 
393  return(1);
394 failed:;
395  libiso_msgs_item_destroy(&item,0);
396  libiso_msgs_unlock(m,0);
397  return(-1);
398 }
399 
400 
401 int libiso_msgs_obtain(struct libiso_msgs *m, struct libiso_msgs_item **item,
402  int severity, int priority, int flag)
403 {
404  int ret;
405  struct libiso_msgs_item *im, *next_im= NULL;
406 
407  *item= NULL;
408  ret= libiso_msgs_lock(m,0);
409  if(ret<=0)
410  return(-1);
411  for(im= m->oldest; im!=NULL; im= next_im) {
412  for(; im!=NULL; im= next_im) {
413  next_im= im->next;
414  if(im->severity>=severity)
415  break;
416  libiso_msgs_item_unlink(im,&(m->oldest),&(m->youngest),0);
417  libiso_msgs_item_destroy(&im,0); /* severity too low: delete */
418  }
419  if(im==NULL)
420  break;
421  if(im->priority>=priority)
422  break;
423  }
424  if(im==NULL)
425  {ret= 0; goto ex;}
426  libiso_msgs_item_unlink(im,&(m->oldest),&(m->youngest),0);
427  *item= im;
428  ret= 1;
429 ex:;
430  libiso_msgs_unlock(m,0);
431  return(ret);
432 }
433 
434 
435 int libiso_msgs_destroy_item(struct libiso_msgs *m,
436  struct libiso_msgs_item **item, int flag)
437 {
438  int ret;
439 
440  ret= libiso_msgs_lock(m,0);
441  if(ret<=0)
442  return(-1);
443  ret= libiso_msgs_item_destroy(item,0);
444  libiso_msgs_unlock(m,0);
445  return(ret);
446 }
447 
int libiso_msgs_item_destroy(struct libiso_msgs_item **item, int flag)
Definition: libiso_msgs.c:86
int libiso_msgs_refer(struct libiso_msgs **pt, struct libiso_msgs *m, int flag)
Definition: libiso_msgs.c:224
int libiso_msgs_submit(struct libiso_msgs *m, int origin, int error_code, int severity, int priority, char *msg_text, int os_errno, int flag)
Definition: libiso_msgs.c:328
int libiso_msgs_destroy(struct libiso_msgs **m, int flag)
Definition: libiso_msgs.c:190
int libiso_msgs_destroy_item(struct libiso_msgs *m, struct libiso_msgs_item **item, int flag)
Definition: libiso_msgs.c:430
int libiso_msgs_item_get_origin(struct libiso_msgs_item *item, double *timestamp, pid_t *process_id, int *origin, int flag)
Definition: libiso_msgs.c:114
int libiso_msgs_new(struct libiso_msgs **m, int flag)
Definition: libiso_msgs.c:137
int libiso_msgs__sev_to_text(int severity, char **severity_name, int flag)
Definition: libiso_msgs.c:286
int libiso_msgs_item_get_rank(struct libiso_msgs_item *item, int *severity, int *priority, int flag)
Definition: libiso_msgs.c:125
int libiso_msgs_item_unlink(struct libiso_msgs_item *o, struct libiso_msgs_item **chain_start, struct libiso_msgs_item **chain_end, int flag)
Definition: libiso_msgs.c:67
int libiso_msgs_set_severities(struct libiso_msgs *m, int queue_severity, int print_severity, char *print_id, int flag)
Definition: libiso_msgs.c:235
int libiso_msgs_item_get_msg(struct libiso_msgs_item *item, int *error_code, char **msg_text, int *os_errno, int flag)
Definition: libiso_msgs.c:103
int libiso_msgs_obtain(struct libiso_msgs *m, struct libiso_msgs_item **item, int severity, int priority, int flag)
Definition: libiso_msgs.c:396
int libiso_msgs__text_to_sev(char *severity_name, int *severity, int flag)
Definition: libiso_msgs.c:249
#define LIBISO_MSGS_SEV_FATAL
Definition: libiso_msgs.h:222
#define LIBISO_MSGS_SEV_ABORT
Definition: libiso_msgs.h:227
#define LIBISO_MSGS_SEV_FAILURE
Definition: libiso_msgs.h:210
#define LIBISO_MSGS_SEV_ALL
Definition: libiso_msgs.h:126
#define LIBISO_MSGS_PRIO_ZERO
Definition: libiso_msgs.h:239
#define LIBISO_MSGS_SEV_ERRFILE
Definition: libiso_msgs.h:138
#define LIBISO_MSGS_SEV_UPDATE
Definition: libiso_msgs.h:147
#define LIBISO_MSGS_SEV_SORRY
Definition: libiso_msgs.h:181
#define LIBISO_MSGS_SEV_WARNING
Definition: libiso_msgs.h:159
#define LIBISO_MSGS_SEV_MISHAP
Definition: libiso_msgs.h:195
#define LIBISO_MSGS_SEV_NOTE
Definition: libiso_msgs.h:151
#define LIBISO_MSGS_SEV_HINT
Definition: libiso_msgs.h:155
#define LIBISO_MSGS_SEV_DEBUG
Definition: libiso_msgs.h:143
#define LIBISO_MSGS_SEV_NEVER
Definition: libiso_msgs.h:232
static int libiso_msgs_item_new(struct libiso_msgs_item **item, struct libiso_msgs_item *link, int flag)
Definition: libiso_msgs.c:35
static int libiso_msgs_lock(struct libiso_msgs *m, int flag)
Definition: libiso_msgs.c:165
static int libiso_msgs_unlock(struct libiso_msgs *m, int flag)
Definition: libiso_msgs.c:180