From: Andreas E. <ag...@us...> - 2010-10-28 12:31:51
|
Update of /cvsroot/nagios/nagios/cgi In directory sfp-cvsdas-3.v30.ch3.sourceforge.com:/tmp/cvs-serv22508/cgi Modified Files: config.c extinfo.c status.c statusmap.c Log Message: Make performance-data handling and checks thread safe It's a bit early to tell, but at least we've gotten rid of the horrible global macro management now, in favour of a macro struct that gets passed around. In truth though, the whole macro machinery needs a rewrite in order to make good sense. Getting all the data before we even know we need it doesn't even begin to make sense, but with this patch we can at least start using concurrent performance-data updates while checks are being started at the same time, and since notifications is currently the only thing (I hope) that isn't overly scratched by this patch, Nagios won't have any issues sending those out while other code looks to performance-data and firing up checks. As a fall-back for eventbroker modules and whatnot that references the global macro_x variable, we retain it but make it point to the global_macros.x. This requires that macros have been initialized, but any code that referenced macro_x before initialization was doomed to "undefined behaviour" earlier anyway, so the fact that they will now for certain segfault on such actions is probably an improvement. For backwards compatibility with existing modules, we let process_macros() and get_raw_command_line() exist with their previous signatures and act as wrappers for the reentrant versions providing the same functionality, passing a global 'nagios_macros *' struct as first argument. The reentrant versions are, as per best practice, named "process_macros_r()" and "get_raw_command_line_r()", respectively. I only checked NDOUtils and DNX for compatibility, so other projects may suffer. Gargantuan patch, I know. The macro machinery was far more central to the Nagios core than I first imagined. Signed-off-by: Andreas Ericsson <ae...@op...> Index: extinfo.c =================================================================== RCS file: /cvsroot/nagios/nagios/cgi/extinfo.c,v retrieving revision 1.96 retrieving revision 1.97 diff -C2 -d -r1.96 -r1.97 *** extinfo.c 23 Oct 2010 09:55:41 -0000 1.96 --- extinfo.c 28 Oct 2010 12:31:40 -0000 1.97 *************** *** 34,37 **** --- 34,39 ---- #include "../include/cgiauth.h" + static nagios_macros *mac; + extern char nagios_check_command[MAX_INPUT_BUFFER]; extern char nagios_process_info[MAX_INPUT_BUFFER]; *************** *** 141,145 **** service *temp_service=NULL; servicegroup *temp_servicegroup=NULL; ! /* get the arguments passed in the URL */ --- 143,148 ---- service *temp_service=NULL; servicegroup *temp_servicegroup=NULL; ! ! mac = get_global_macros(); /* get the arguments passed in the URL */ *************** *** 229,237 **** temp_host=find_host(host_name); ! grab_host_macros(temp_host); if(display_type==DISPLAY_SERVICE_INFO){ temp_service=find_service(host_name,service_desc); ! grab_service_macros(temp_service); } --- 232,240 ---- temp_host=find_host(host_name); ! grab_host_macros(mac, temp_host); if(display_type==DISPLAY_SERVICE_INFO){ temp_service=find_service(host_name,service_desc); ! grab_service_macros(mac, temp_service); } *************** *** 257,261 **** else if(display_type==DISPLAY_HOSTGROUP_INFO){ temp_hostgroup=find_hostgroup(hostgroup_name); ! grab_hostgroup_macros(temp_hostgroup); } --- 260,264 ---- else if(display_type==DISPLAY_HOSTGROUP_INFO){ temp_hostgroup=find_hostgroup(hostgroup_name); ! grab_hostgroup_macros(mac, temp_hostgroup); } *************** *** 263,267 **** else if(display_type==DISPLAY_SERVICEGROUP_INFO){ temp_servicegroup=find_servicegroup(servicegroup_name); ! grab_servicegroup_macros(temp_servicegroup); } --- 266,270 ---- else if(display_type==DISPLAY_SERVICEGROUP_INFO){ temp_servicegroup=find_servicegroup(servicegroup_name); ! grab_servicegroup_macros(mac, temp_servicegroup); } *************** *** 376,380 **** printf("<DIV CLASS='dataTitle'>(%s)</DIV>\n",temp_hostgroup->group_name); if(temp_hostgroup->notes!=NULL){ ! process_macros(temp_hostgroup->notes,&processed_string,0); printf("<p>%s</p>",processed_string); free(processed_string); --- 379,383 ---- printf("<DIV CLASS='dataTitle'>(%s)</DIV>\n",temp_hostgroup->group_name); if(temp_hostgroup->notes!=NULL){ ! process_macros_r(mac, temp_hostgroup->notes,&processed_string,0); printf("<p>%s</p>",processed_string); free(processed_string); *************** *** 386,390 **** printf("<DIV CLASS='dataTitle'>(%s)</DIV>\n",temp_servicegroup->group_name); if(temp_servicegroup->notes!=NULL){ ! process_macros(temp_servicegroup->notes,&processed_string,0); printf("<p>%s</p>",processed_string); free(processed_string); --- 389,393 ---- printf("<DIV CLASS='dataTitle'>(%s)</DIV>\n",temp_servicegroup->group_name); if(temp_servicegroup->notes!=NULL){ ! process_macros_r(mac, temp_servicegroup->notes,&processed_string,0); printf("<p>%s</p>",processed_string); free(processed_string); *************** *** 395,399 **** if(temp_service->icon_image!=NULL){ printf("<img src='%s",url_logo_images_path); ! process_macros(temp_service->icon_image,&processed_string,0); printf("%s",processed_string); free(processed_string); --- 398,402 ---- if(temp_service->icon_image!=NULL){ printf("<img src='%s",url_logo_images_path); ! process_macros_r(mac, temp_service->icon_image,&processed_string,0); printf("%s",processed_string); free(processed_string); *************** *** 403,407 **** printf("<font size=-1><i>( %s )</i></font>\n",temp_service->icon_image_alt); if(temp_service->notes!=NULL){ ! process_macros(temp_service->notes,&processed_string,0); printf("<p>%s</p>\n",processed_string); free(processed_string); --- 406,410 ---- printf("<font size=-1><i>( %s )</i></font>\n",temp_service->icon_image_alt); if(temp_service->notes!=NULL){ ! process_macros_r(mac, temp_service->notes,&processed_string,0); printf("<p>%s</p>\n",processed_string); free(processed_string); *************** *** 412,416 **** if(temp_host->icon_image!=NULL){ printf("<img src='%s",url_logo_images_path); ! process_macros(temp_host->icon_image,&processed_string,0); printf("%s",processed_string); free(processed_string); --- 415,419 ---- if(temp_host->icon_image!=NULL){ printf("<img src='%s",url_logo_images_path); ! process_macros_r(mac, temp_host->icon_image,&processed_string,0); printf("%s",processed_string); free(processed_string); *************** *** 420,424 **** printf("<font size=-1><i>( %s )</i><font>\n",temp_host->icon_image_alt); if(temp_host->notes!=NULL){ ! process_macros(temp_host->notes,&processed_string,0); printf("<p>%s</p>\n",processed_string); free(processed_string); --- 423,427 ---- printf("<font size=-1><i>( %s )</i><font>\n",temp_host->icon_image_alt); if(temp_host->notes!=NULL){ ! process_macros_r(mac, temp_host->notes,&processed_string,0); printf("<p>%s</p>\n",processed_string); free(processed_string); *************** *** 437,441 **** printf("<TR><TD ALIGN='right'>\n"); printf("<A HREF='"); ! process_macros(temp_host->action_url,&processed_string,0); printf("%s",processed_string); free(processed_string); --- 440,444 ---- printf("<TR><TD ALIGN='right'>\n"); printf("<A HREF='"); ! process_macros_r(mac, temp_host->action_url,&processed_string,0); printf("%s",processed_string); free(processed_string); *************** *** 447,451 **** printf("<TR><TD ALIGN='right'>\n"); printf("<A HREF='"); ! process_macros(temp_host->notes_url,&processed_string,0); printf("%s",processed_string); free(processed_string); --- 450,454 ---- printf("<TR><TD ALIGN='right'>\n"); printf("<A HREF='"); ! process_macros_r(mac, temp_host->notes_url,&processed_string,0); printf("%s",processed_string); free(processed_string); *************** *** 462,466 **** if(temp_service->action_url!=NULL && strcmp(temp_service->action_url,"")){ printf("<A HREF='"); ! process_macros(temp_service->action_url,&processed_string,0); printf("%s",processed_string); free(processed_string); --- 465,469 ---- if(temp_service->action_url!=NULL && strcmp(temp_service->action_url,"")){ printf("<A HREF='"); ! process_macros_r(mac, temp_service->action_url,&processed_string,0); printf("%s",processed_string); free(processed_string); *************** *** 470,474 **** if(temp_service->notes_url!=NULL && strcmp(temp_service->notes_url,"")){ printf("<A HREF='"); ! process_macros(temp_service->notes_url,&processed_string,0); printf("%s",processed_string); free(processed_string); --- 473,477 ---- if(temp_service->notes_url!=NULL && strcmp(temp_service->notes_url,"")){ printf("<A HREF='"); ! process_macros_r(mac, temp_service->notes_url,&processed_string,0); printf("%s",processed_string); free(processed_string); Index: config.c =================================================================== RCS file: /cvsroot/nagios/nagios/cgi/config.c,v retrieving revision 1.51 retrieving revision 1.52 diff -C2 -d -r1.51 -r1.52 *** config.c 1 Sep 2010 14:19:59 -0000 1.51 --- config.c 28 Oct 2010 12:31:40 -0000 1.52 *************** *** 31,34 **** --- 31,36 ---- #include "../include/getcgi.h" + static nagios_macros *mac; + extern char main_config_file[MAX_FILENAME_LENGTH]; extern char url_html_path[MAX_FILENAME_LENGTH]; *************** *** 113,118 **** } ! int main(void){ int result=OK; /* get the arguments passed in the URL */ --- 115,122 ---- } ! int main(void) ! { int result=OK; + mac = get_global_macros(); /* get the arguments passed in the URL */ *************** *** 516,520 **** /* grab macros */ ! grab_host_macros(temp_host); if(odd){ --- 520,524 ---- /* grab macros */ ! grab_host_macros(mac, temp_host); if(odd){ *************** *** 749,753 **** printf("<TD CLASS='%s'> </TD>",bg_class); else{ ! process_macros(temp_host->icon_image,&processed_string,0); printf("<TD CLASS='%s' valign='center'><img src='%s%s' border='0' width='20' height='20'> %s</TD>",bg_class,url_logo_images_path,processed_string,html_encode(temp_host->icon_image,FALSE)); free(processed_string); --- 753,757 ---- printf("<TD CLASS='%s'> </TD>",bg_class); else{ ! process_macros_r(mac, temp_host->icon_image,&processed_string,0); printf("<TD CLASS='%s' valign='center'><img src='%s%s' border='0' width='20' height='20'> %s</TD>",bg_class,url_logo_images_path,processed_string,html_encode(temp_host->icon_image,FALSE)); free(processed_string); *************** *** 1258,1262 **** /* grab macros */ ! grab_service_macros(temp_service); if(odd){ --- 1262,1266 ---- /* grab macros */ ! grab_service_macros(mac, temp_service); if(odd){ *************** *** 1473,1477 **** printf("<TD CLASS='%s'> </TD>",bg_class); else{ ! process_macros(temp_service->icon_image,&processed_string,0); printf("<TD CLASS='%s' valign='center'><img src='%s%s' border='0' width='20' height='20'> %s</TD>",bg_class,url_logo_images_path,processed_string,html_encode(temp_service->icon_image,FALSE)); free(processed_string); --- 1477,1481 ---- printf("<TD CLASS='%s'> </TD>",bg_class); else{ ! process_macros_r(mac, temp_service->icon_image,&processed_string,0); printf("<TD CLASS='%s' valign='center'><img src='%s%s' border='0' width='20' height='20'> %s</TD>",bg_class,url_logo_images_path,processed_string,html_encode(temp_service->icon_image,FALSE)); free(processed_string); Index: statusmap.c =================================================================== RCS file: /cvsroot/nagios/nagios/cgi/statusmap.c,v retrieving revision 1.44 retrieving revision 1.45 diff -C2 -d -r1.44 -r1.45 *** statusmap.c 7 Jul 2009 22:19:45 -0000 1.44 --- statusmap.c 28 Oct 2010 12:31:40 -0000 1.45 *************** *** 40,43 **** --- 40,45 ---- #include <gdfonts.h> /* GD library small font definition */ + static nagios_macros *mac; + extern int refresh_rate; *************** *** 234,237 **** --- 236,241 ---- int result; + mac = get_global_macros(); + /* reset internal variables */ reset_cgi_vars(); *************** *** 1931,1935 **** /* grab macros */ ! grab_host_macros(hst); /* strip nasty stuff from plugin output */ --- 1935,1939 ---- /* grab macros */ ! grab_host_macros(mac, hst); /* strip nasty stuff from plugin output */ *************** *** 1942,1946 **** printf("%s",UNKNOWN_ICON_IMAGE); else{ ! process_macros(hst->icon_image,&processed_string,0); printf("%s",processed_string); free(processed_string); --- 1946,1950 ---- printf("%s",UNKNOWN_ICON_IMAGE); else{ ! process_macros_r(mac, hst->icon_image,&processed_string,0); printf("%s",processed_string); free(processed_string); Index: status.c =================================================================== RCS file: /cvsroot/nagios/nagios/cgi/status.c,v retrieving revision 1.86 retrieving revision 1.87 diff -C2 -d -r1.86 -r1.87 *** status.c 27 Oct 2010 19:23:05 -0000 1.86 --- status.c 28 Oct 2010 12:31:40 -0000 1.87 *************** *** 66,69 **** --- 66,70 ---- extern servicestatus *servicestatus_list; + static nagios_macros *mac; #define MAX_MESSAGE_BUFFER 4096 *************** *** 190,194 **** int regex_i=1,i=0; int len; ! time(¤t_time); --- 191,197 ---- int regex_i=1,i=0; int len; ! ! mac = get_global_macros(); ! time(¤t_time); *************** *** 1557,1561 **** /* grab macros */ ! grab_host_macros(temp_host); if(temp_hoststatus->status==HOST_DOWN){ --- 1560,1564 ---- /* grab macros */ ! grab_host_macros(mac, temp_host); if(temp_hoststatus->status==HOST_DOWN){ *************** *** 1616,1620 **** printf("<TD align=center valign=center>"); printf("<A HREF='"); ! process_macros(temp_host->notes_url,&processed_string,0); printf("%s",processed_string); free(processed_string); --- 1619,1623 ---- printf("<TD align=center valign=center>"); printf("<A HREF='"); ! process_macros_r(mac, temp_host->notes_url,&processed_string,0); printf("%s",processed_string); free(processed_string); *************** *** 1627,1631 **** printf("<TD align=center valign=center>"); printf("<A HREF='"); ! process_macros(temp_host->action_url,&processed_string,0); printf("%s",processed_string); free(processed_string); --- 1630,1634 ---- printf("<TD align=center valign=center>"); printf("<A HREF='"); ! process_macros_r(mac, temp_host->action_url,&processed_string,0); printf("%s",processed_string); free(processed_string); *************** *** 1639,1643 **** printf("<A HREF='%s?type=%d&host=%s'>",EXTINFO_CGI,DISPLAY_HOST_INFO,url_encode(temp_status->host_name)); printf("<IMG SRC='%s",url_logo_images_path); ! process_macros(temp_host->icon_image,&processed_string,0); printf("%s",processed_string); free(processed_string); --- 1642,1646 ---- printf("<A HREF='%s?type=%d&host=%s'>",EXTINFO_CGI,DISPLAY_HOST_INFO,url_encode(temp_status->host_name)); printf("<IMG SRC='%s",url_logo_images_path); ! process_macros_r(mac, temp_host->icon_image,&processed_string,0); printf("%s",processed_string); free(processed_string); *************** *** 1657,1661 **** /* grab macros */ ! grab_service_macros(temp_service); /* service name column */ --- 1660,1664 ---- /* grab macros */ ! grab_service_macros(mac, temp_service); /* service name column */ *************** *** 1710,1714 **** printf("<TD align=center valign=center>"); printf("<A HREF='"); ! process_macros(temp_service->notes_url,&processed_string,0); printf("%s",processed_string); free(processed_string); --- 1713,1717 ---- printf("<TD align=center valign=center>"); printf("<A HREF='"); ! process_macros_r(mac, temp_service->notes_url,&processed_string,0); printf("%s",processed_string); free(processed_string); *************** *** 1721,1725 **** printf("<TD align=center valign=center>"); printf("<A HREF='"); ! process_macros(temp_service->action_url,&processed_string,0); printf("%s",processed_string); free(processed_string); --- 1724,1728 ---- printf("<TD align=center valign=center>"); printf("<A HREF='"); ! process_macros_r(mac, temp_service->action_url,&processed_string,0); printf("%s",processed_string); free(processed_string); *************** *** 1734,1738 **** printf("&service=%s'>",url_encode(temp_service->description)); printf("<IMG SRC='%s",url_logo_images_path); ! process_macros(temp_service->icon_image,&processed_string,0); printf("%s",processed_string); free(processed_string); --- 1737,1741 ---- printf("&service=%s'>",url_encode(temp_service->description)); printf("<IMG SRC='%s",url_logo_images_path); ! process_macros_r(mac, temp_service->icon_image,&processed_string,0); printf("%s",processed_string); free(processed_string); *************** *** 2019,2023 **** /* grab macros */ ! grab_host_macros(temp_host); --- 2022,2026 ---- /* grab macros */ ! grab_host_macros(mac, temp_host); *************** *** 2109,2113 **** printf("<TD align=center valign=center>"); printf("<A HREF='"); ! process_macros(temp_host->notes_url,&processed_string,0); printf("%s",processed_string); free(processed_string); --- 2112,2116 ---- printf("<TD align=center valign=center>"); printf("<A HREF='"); ! process_macros_r(mac, temp_host->notes_url,&processed_string,0); printf("%s",processed_string); free(processed_string); *************** *** 2120,2124 **** printf("<TD align=center valign=center>"); printf("<A HREF='"); ! process_macros(temp_host->action_url,&processed_string,0); printf("%s",processed_string); free(processed_string); --- 2123,2127 ---- printf("<TD align=center valign=center>"); printf("<A HREF='"); ! process_macros_r(mac, temp_host->action_url,&processed_string,0); printf("%s",processed_string); free(processed_string); *************** *** 2132,2136 **** printf("<A HREF='%s?type=%d&host=%s'>",EXTINFO_CGI,DISPLAY_HOST_INFO,url_encode(temp_status->host_name)); printf("<IMG SRC='%s",url_logo_images_path); ! process_macros(temp_host->icon_image,&processed_string,0); printf("%s",processed_string); free(processed_string); --- 2135,2139 ---- printf("<A HREF='%s?type=%d&host=%s'>",EXTINFO_CGI,DISPLAY_HOST_INFO,url_encode(temp_status->host_name)); printf("<IMG SRC='%s",url_logo_images_path); ! process_macros_r(mac, temp_host->icon_image,&processed_string,0); printf("%s",processed_string); free(processed_string); *************** *** 3171,3175 **** printf("<A HREF='%s?type=%d&host=%s'>\n",EXTINFO_CGI,DISPLAY_HOST_INFO,url_encode(temp_host->name)); printf("<IMG SRC='%s",url_logo_images_path); ! process_macros(temp_host->icon_image,&processed_string,0); printf("%s",processed_string); free(processed_string); --- 3174,3178 ---- printf("<A HREF='%s?type=%d&host=%s'>\n",EXTINFO_CGI,DISPLAY_HOST_INFO,url_encode(temp_host->name)); printf("<IMG SRC='%s",url_logo_images_path); ! process_macros_r(mac, temp_host->icon_image,&processed_string,0); printf("%s",processed_string); free(processed_string); *************** *** 3227,3231 **** /* grab macros */ ! grab_host_macros(temp_host); printf("<A HREF='%s?type=%d&host=%s'>\n",EXTINFO_CGI,DISPLAY_HOST_INFO,url_encode(temp_host->name)); --- 3230,3234 ---- /* grab macros */ ! grab_host_macros(mac, temp_host); printf("<A HREF='%s?type=%d&host=%s'>\n",EXTINFO_CGI,DISPLAY_HOST_INFO,url_encode(temp_host->name)); *************** *** 3235,3239 **** if(temp_host->notes_url!=NULL){ printf("<A HREF='"); ! process_macros(temp_host->notes_url,&processed_string,0); printf("%s",processed_string); free(processed_string); --- 3238,3242 ---- if(temp_host->notes_url!=NULL){ printf("<A HREF='"); ! process_macros_r(mac, temp_host->notes_url,&processed_string,0); printf("%s",processed_string); free(processed_string); *************** *** 3244,3248 **** if(temp_host->action_url!=NULL){ printf("<A HREF='"); ! process_macros(temp_host->action_url,&processed_string,0); printf("%s",processed_string); free(processed_string); --- 3247,3251 ---- if(temp_host->action_url!=NULL){ printf("<A HREF='"); ! process_macros_r(mac, temp_host->action_url,&processed_string,0); printf("%s",processed_string); free(processed_string); *************** *** 3480,3484 **** /* grab macros */ ! grab_host_macros(temp_host); if(hststatus->status==HOST_PENDING){ --- 3483,3487 ---- /* grab macros */ ! grab_host_macros(mac, temp_host); if(hststatus->status==HOST_PENDING){ *************** *** 3518,3522 **** printf("<a href='%s?type=%d&host=%s'>",EXTINFO_CGI,DISPLAY_HOST_INFO,url_encode(hststatus->host_name)); printf("<IMG SRC='%s",url_logo_images_path); ! process_macros(temp_host->icon_image,&processed_string,0); printf("%s",processed_string); free(processed_string); --- 3521,3525 ---- printf("<a href='%s?type=%d&host=%s'>",EXTINFO_CGI,DISPLAY_HOST_INFO,url_encode(hststatus->host_name)); printf("<IMG SRC='%s",url_logo_images_path); ! process_macros_r(mac, temp_host->icon_image,&processed_string,0); printf("%s",processed_string); free(processed_string); *************** *** 3539,3543 **** if(temp_host->notes_url!=NULL){ printf("<A HREF='"); ! process_macros(temp_host->notes_url,&processed_string,0); printf("%s",processed_string); free(processed_string); --- 3542,3546 ---- if(temp_host->notes_url!=NULL){ printf("<A HREF='"); ! process_macros_r(mac, temp_host->notes_url,&processed_string,0); printf("%s",processed_string); free(processed_string); *************** *** 3548,3552 **** if(temp_host->action_url!=NULL){ printf("<A HREF='"); ! process_macros(temp_host->action_url,&processed_string,0); printf("%s",processed_string); free(processed_string); --- 3551,3555 ---- if(temp_host->action_url!=NULL){ printf("<A HREF='"); ! process_macros_r(mac, temp_host->action_url,&processed_string,0); printf("%s",processed_string); free(processed_string); *************** *** 4350,4354 **** /* grab macros */ ! grab_host_macros(temp_host); /* find the host status */ --- 4353,4357 ---- /* grab macros */ ! grab_host_macros(mac, temp_host); /* find the host status */ *************** *** 4397,4401 **** printf("<A HREF='%s?type=%d&host=%s'>\n",EXTINFO_CGI,DISPLAY_HOST_INFO,url_encode(temp_host->name)); printf("<IMG SRC='%s",url_logo_images_path); ! process_macros(temp_host->icon_image,&processed_string,0); printf("%s",processed_string); free(processed_string); --- 4400,4404 ---- printf("<A HREF='%s?type=%d&host=%s'>\n",EXTINFO_CGI,DISPLAY_HOST_INFO,url_encode(temp_host->name)); printf("<IMG SRC='%s",url_logo_images_path); ! process_macros_r(mac, temp_host->icon_image,&processed_string,0); printf("%s",processed_string); free(processed_string); *************** *** 4430,4434 **** /* grab macros */ ! grab_service_macros(temp_service); /* get the status of the service */ --- 4433,4437 ---- /* grab macros */ ! grab_service_macros(mac, temp_service); /* get the status of the service */ *************** *** 4464,4468 **** if(temp_host->notes_url!=NULL){ printf("<A HREF='"); ! process_macros(temp_host->notes_url,&processed_string,0); printf("%s",processed_string); free(processed_string); --- 4467,4471 ---- if(temp_host->notes_url!=NULL){ printf("<A HREF='"); ! process_macros_r(mac, temp_host->notes_url,&processed_string,0); printf("%s",processed_string); free(processed_string); *************** *** 4473,4477 **** if(temp_host->action_url!=NULL){ printf("<A HREF='"); ! process_macros(temp_host->action_url,&processed_string,0); printf("%s",processed_string); free(processed_string); --- 4476,4480 ---- if(temp_host->action_url!=NULL){ printf("<A HREF='"); ! process_macros_r(mac, temp_host->action_url,&processed_string,0); printf("%s",processed_string); free(processed_string); |