Revert "Merge branch 'master' of git.omp.am:/home/omp/git/conky"
[monky] / src / obj_destroy.c
1 /* -*- mode: c; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: t -*-
2  *
3  * Conky, a system monitor, based on torsmo
4  *
5  * Any original torsmo code is licensed under the BSD license
6  *
7  * All code written since the fork of torsmo is licensed under the GPL
8  *
9  * Please see COPYING for details
10  *
11  * Copyright (c) 2004, Hannu Saransaari and Lauri Hakkarainen
12  * Copyright (c) 2005-2009 Brenden Matthews, Philip Kovacs, et. al.
13  *      (see AUTHORS)
14  * All rights reserved.
15  *
16  * This program is free software: you can redistribute it and/or modify
17  * it under the terms of the GNU General Public License as published by
18  * the Free Software Foundation, either version 3 of the License, or
19  * (at your option) any later version.
20  *
21  * This program is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24  * GNU General Public License for more details.
25  * You should have received a copy of the GNU General Public License
26  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
27  *
28  * vim: ts=4 sw=4 noet ai cindent syntax=c
29  *
30  */
31
32 /* local headers */
33 #include "obj_destroy.h"
34
35 /*
36  * Frees the list of text objects root points to.  When internal = 1, it won't
37  * free global objects.
38  */
39 void free_text_objects(struct text_object *root, int internal)
40 {
41         struct text_object *obj;
42
43         if (!root->prev) {
44                 return;
45         }
46
47 #define data obj->data
48         for (obj = root->prev; obj; obj = root->prev) {
49                 root->prev = obj->prev;
50                 switch (obj->type) {
51 #ifndef __OpenBSD__
52                         case OBJ_acpitemp:
53                                 close(data.i);
54                                 break;
55 #endif /* !__OpenBSD__ */
56 #ifdef __linux__
57                         case OBJ_i2c:
58                         case OBJ_platform:
59                         case OBJ_hwmon:
60                                 close(data.sysfs.fd);
61                                 break;
62 #endif /* __linux__ */
63                         case OBJ_read_tcp:
64                                 free(data.read_tcp.host);
65                                 break;
66                         case OBJ_time:
67                         case OBJ_utime:
68                                 free(data.s);
69                                 break;
70                         case OBJ_tztime:
71                                 free(data.tztime.tz);
72                                 free(data.tztime.fmt);
73                                 break;
74                         case OBJ_mboxscan:
75                                 free(data.mboxscan.args);
76                                 free(data.mboxscan.output);
77                                 break;
78                         case OBJ_mails:
79                         case OBJ_new_mails:
80                         case OBJ_seen_mails:
81                         case OBJ_unseen_mails:
82                         case OBJ_flagged_mails:
83                         case OBJ_unflagged_mails:
84                         case OBJ_forwarded_mails:
85                         case OBJ_unforwarded_mails:
86                         case OBJ_replied_mails:
87                         case OBJ_unreplied_mails:
88                         case OBJ_draft_mails:
89                         case OBJ_trashed_mails:
90                                 free(data.local_mail.mbox);
91                                 break;
92                         case OBJ_imap_unseen:
93                                 if (!obj->char_b) {
94                                         free(data.mail);
95                                 }
96                                 break;
97                         case OBJ_imap_messages:
98                                 if (!obj->char_b) {
99                                         free(data.mail);
100                                 }
101                                 break;
102                         case OBJ_pop3_unseen:
103                                 if (!obj->char_b) {
104                                         free(data.mail);
105                                 }
106                                 break;
107                         case OBJ_pop3_used:
108                                 if (!obj->char_b) {
109                                         free(data.mail);
110                                 }
111                                 break;
112                         case OBJ_if_empty:
113                         case OBJ_if_match:
114                                 free_text_objects(obj->sub, 1);
115                                 free(obj->sub);
116                                 /* fall through */
117                         case OBJ_if_existing:
118                         case OBJ_if_mounted:
119                         case OBJ_if_running:
120                                 free(data.ifblock.s);
121                                 free(data.ifblock.str);
122                                 break;
123                         case OBJ_head:
124                         case OBJ_tail:
125                                 free(data.headtail.logfile);
126                                 if(data.headtail.buffer) {
127                                         free(data.headtail.buffer);
128                                 }
129                                 break;
130                         case OBJ_text:
131                         case OBJ_font:
132                         case OBJ_image:
133                         case OBJ_eval:
134                         case OBJ_exec:
135                         case OBJ_execbar:
136 #ifdef X11
137                         case OBJ_execgauge:
138                         case OBJ_execgraph:
139 #endif
140                         case OBJ_execp:
141                                 free(data.s);
142                                 break;
143 #ifdef HAVE_ICONV
144                         case OBJ_iconv_start:
145                                 free_iconv();
146                                 break;
147 #endif
148 #ifdef __linux__
149                         case OBJ_disk_protect:
150                                 free(data.s);
151                                 break;
152                         case OBJ_if_gw:
153                                 free(data.ifblock.s);
154                                 free(data.ifblock.str);
155                         case OBJ_gw_iface:
156                         case OBJ_gw_ip:
157                                 if (info.gw_info.iface) {
158                                         free(info.gw_info.iface);
159                                         info.gw_info.iface = 0;
160                                 }
161                                 if (info.gw_info.ip) {
162                                         free(info.gw_info.ip);
163                                         info.gw_info.ip = 0;
164                                 }
165                                 break;
166                         case OBJ_ioscheduler:
167                                 if(data.s)
168                                         free(data.s);
169                                 break;
170 #endif
171 #if (defined(__FreeBSD__) || defined(__linux__))
172                         case OBJ_if_up:
173                                 free(data.ifblock.s);
174                                 free(data.ifblock.str);
175                                 break;
176 #endif
177 #ifdef XMMS2
178                         case OBJ_xmms2_artist:
179                                 if (info.xmms2.artist) {
180                                         free(info.xmms2.artist);
181                                         info.xmms2.artist = 0;
182                                 }
183                                 break;
184                         case OBJ_xmms2_album:
185                                 if (info.xmms2.album) {
186                                         free(info.xmms2.album);
187                                         info.xmms2.album = 0;
188                                 }
189                                 break;
190                         case OBJ_xmms2_title:
191                                 if (info.xmms2.title) {
192                                         free(info.xmms2.title);
193                                         info.xmms2.title = 0;
194                                 }
195                                 break;
196                         case OBJ_xmms2_genre:
197                                 if (info.xmms2.genre) {
198                                         free(info.xmms2.genre);
199                                         info.xmms2.genre = 0;
200                                 }
201                                 break;
202                         case OBJ_xmms2_comment:
203                                 if (info.xmms2.comment) {
204                                         free(info.xmms2.comment);
205                                         info.xmms2.comment = 0;
206                                 }
207                                 break;
208                         case OBJ_xmms2_url:
209                                 if (info.xmms2.url) {
210                                         free(info.xmms2.url);
211                                         info.xmms2.url = 0;
212                                 }
213                                 break;
214                         case OBJ_xmms2_date:
215                                 if (info.xmms2.date) {
216                                         free(info.xmms2.date);
217                                         info.xmms2.date = 0;
218                                 }
219                                 break;
220                         case OBJ_xmms2_status:
221                                 if (info.xmms2.status) {
222                                         free(info.xmms2.status);
223                                         info.xmms2.status = 0;
224                                 }
225                                 break;
226                         case OBJ_xmms2_playlist:
227                                 if (info.xmms2.playlist) {
228                                         free(info.xmms2.playlist);
229                                         info.xmms2.playlist = 0;
230                                 }
231                                 break;
232                         case OBJ_xmms2_smart:
233                                 if (info.xmms2.artist) {
234                                         free(info.xmms2.artist);
235                                         info.xmms2.artist = 0;
236                                 }
237                                 if (info.xmms2.title) {
238                                         free(info.xmms2.title);
239                                         info.xmms2.title = 0;
240                                 }
241                                 if (info.xmms2.url) {
242                                         free(info.xmms2.url);
243                                         info.xmms2.url = 0;
244                                 }
245                                 break;
246 #endif
247 #ifdef BMPX
248                         case OBJ_bmpx_title:
249                         case OBJ_bmpx_artist:
250                         case OBJ_bmpx_album:
251                         case OBJ_bmpx_track:
252                         case OBJ_bmpx_uri:
253                         case OBJ_bmpx_bitrate:
254                                 break;
255 #endif
256 #ifdef EVE
257                         case OBJ_eve:
258                                 break;
259 #endif
260 #ifdef HAVE_CURL
261                         case OBJ_curl:
262                                 free(data.curl.uri);
263                                 break;
264 #endif
265 #ifdef RSS
266                         case OBJ_rss:
267                                 free(data.rss.uri);
268                                 free(data.rss.action);
269                                 break;
270 #endif
271 #ifdef WEATHER
272                         case OBJ_weather:
273                                 free(data.weather.uri);
274                                 free(data.weather.data_type);
275                                 break;
276 #endif
277 #ifdef XOAP
278                         case OBJ_weather_forecast:
279                                 free(data.weather_forecast.uri);
280                                 free(data.weather_forecast.data_type);
281                                 break;
282 #endif
283 #ifdef HAVE_LUA
284                         case OBJ_lua:
285                         case OBJ_lua_parse:
286                         case OBJ_lua_bar:
287 #ifdef X11
288                         case OBJ_lua_graph:
289                         case OBJ_lua_gauge:
290 #endif /* X11 */
291                                 free(data.s);
292                                 break;
293 #endif /* HAVE_LUA */
294                         case OBJ_pre_exec:
295                                 break;
296 #ifndef __OpenBSD__
297                         case OBJ_battery:
298                                 free(data.s);
299                                 break;
300                         case OBJ_battery_short:
301                                 free(data.s);
302                                 break;
303                         case OBJ_battery_time:
304                                 free(data.s);
305                                 break;
306 #endif /* !__OpenBSD__ */
307                         case OBJ_execpi:
308                         case OBJ_execi:
309                         case OBJ_execibar:
310 #ifdef X11
311                         case OBJ_execigraph:
312                         case OBJ_execigauge:
313 #endif /* X11 */
314                                 free(data.execi.cmd);
315                                 free(data.execi.buffer);
316                                 break;
317                         case OBJ_texeci:
318                                 if (data.texeci.p_timed_thread) timed_thread_destroy(data.texeci.p_timed_thread, &data.texeci.p_timed_thread);
319                                 free(data.texeci.cmd);
320                                 free(data.texeci.buffer);
321                                 break;
322                         case OBJ_nameserver:
323                                 free_dns_data();
324                                 break;
325                         case OBJ_top:
326                         case OBJ_top_mem:
327                         case OBJ_top_time:
328 #ifdef IOSTATS
329                         case OBJ_top_io:
330 #endif
331                                 if (info.first_process && !internal) {
332                                         free_all_processes();
333                                         info.first_process = NULL;
334                                 }
335                                 if (data.top.s) free(data.top.s);
336                                 break;
337 #ifdef HDDTEMP
338                         case OBJ_hddtemp:
339                                 free(data.hddtemp.dev);
340                                 free(data.hddtemp.addr);
341                                 if (data.hddtemp.temp)
342                                         free(data.hddtemp.temp);
343                                 break;
344 #endif /* HDDTEMP */
345                         case OBJ_entropy_avail:
346                         case OBJ_entropy_perc:
347                         case OBJ_entropy_poolsize:
348                         case OBJ_entropy_bar:
349                                 break;
350                         case OBJ_user_names:
351                                 if (info.users.names) {
352                                         free(info.users.names);
353                                         info.users.names = 0;
354                                 }
355                                 break;
356                         case OBJ_user_terms:
357                                 if (info.users.terms) {
358                                         free(info.users.terms);
359                                         info.users.terms = 0;
360                                 }
361                                 break;
362                         case OBJ_user_times:
363                                 if (info.users.times) {
364                                         free(info.users.times);
365                                         info.users.times = 0;
366                                 }
367                                 break;
368 #ifdef IBM
369                         case OBJ_smapi:
370                         case OBJ_smapi_bat_perc:
371                         case OBJ_smapi_bat_temp:
372                         case OBJ_smapi_bat_power:
373                                 free(data.s);
374                                 break;
375                         case OBJ_if_smapi_bat_installed:
376                                 free(data.ifblock.s);
377                                 free(data.ifblock.str);
378                                 break;
379 #endif /* IBM */
380 #ifdef NVIDIA
381                         case OBJ_nvidia:
382                                 break;
383 #endif /* NVIDIA */
384 #ifdef MPD
385                         case OBJ_mpd_title:
386                         case OBJ_mpd_artist:
387                         case OBJ_mpd_album:
388                         case OBJ_mpd_random:
389                         case OBJ_mpd_repeat:
390                         case OBJ_mpd_vol:
391                         case OBJ_mpd_bitrate:
392                         case OBJ_mpd_status:
393                         case OBJ_mpd_bar:
394                         case OBJ_mpd_elapsed:
395                         case OBJ_mpd_length:
396                         case OBJ_mpd_track:
397                         case OBJ_mpd_name:
398                         case OBJ_mpd_file:
399                         case OBJ_mpd_percent:
400                         case OBJ_mpd_smart:
401                         case OBJ_if_mpd_playing:
402                                 free_mpd();
403                                 break;
404 #endif /* MPD */
405 #ifdef MOC
406                         case OBJ_moc_state:
407                         case OBJ_moc_file:
408                         case OBJ_moc_title:
409                         case OBJ_moc_artist:
410                         case OBJ_moc_song:
411                         case OBJ_moc_album:
412                         case OBJ_moc_totaltime:
413                         case OBJ_moc_timeleft:
414                         case OBJ_moc_curtime:
415                         case OBJ_moc_bitrate:
416                         case OBJ_moc_rate:
417                                 free_moc();
418                                 break;
419 #endif /* MOC */
420                         case OBJ_include:
421                         case OBJ_blink:
422                         case OBJ_to_bytes:
423                                 if(obj->sub) {
424                                         free_text_objects(obj->sub, 1);
425                                         free(obj->sub);
426                                 }
427                                 break;
428                         case OBJ_scroll:
429                                 free(data.scroll.text);
430                                 free_text_objects(obj->sub, 1);
431                                 free(obj->sub);
432                                 break;
433                         case OBJ_combine:
434                                 free(data.combine.left);
435                                 free(data.combine.seperation);
436                                 free(data.combine.right);
437                                 free_text_objects(obj->sub, 1);
438                                 free(obj->sub);
439                                 break;
440 #ifdef APCUPSD
441                         case OBJ_apcupsd:
442                         case OBJ_apcupsd_name:
443                         case OBJ_apcupsd_model:
444                         case OBJ_apcupsd_upsmode:
445                         case OBJ_apcupsd_cable:
446                         case OBJ_apcupsd_status:
447                         case OBJ_apcupsd_linev:
448                         case OBJ_apcupsd_load:
449                         case OBJ_apcupsd_loadbar:
450 #ifdef X11
451                         case OBJ_apcupsd_loadgraph:
452                         case OBJ_apcupsd_loadgauge:
453 #endif /* X11 */
454                         case OBJ_apcupsd_charge:
455                         case OBJ_apcupsd_timeleft:
456                         case OBJ_apcupsd_temp:
457                         case OBJ_apcupsd_lastxfer:
458                                 break;
459 #endif /* APCUPSD */
460 #ifdef X11
461                         case OBJ_desktop:
462                         case OBJ_desktop_number:
463                         case OBJ_desktop_name:
464                                 if(info.x11.desktop.name) {
465                                   free(info.x11.desktop.name);
466                                   info.x11.desktop.name = NULL;
467                                 }
468                                 if(info.x11.desktop.all_names) {
469                                   free(info.x11.desktop.all_names);
470                                   info.x11.desktop.all_names = NULL;
471                                 }
472                                 break;
473 #endif /* X11 */
474                 }
475                 free(obj);
476         }
477 #undef data
478 }
479