/************************************************************************ * * CONVERTCFG.C - Config File Converter * * Copyright (c) 2001-2005 Ethan Galstad (egalstad@nagios.org) * Last Modified: 08-12-2005 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * ************************************************************************/ #include #include #include char *my_strsep(char **, const char *); int main(int argc, char **argv) { FILE *fp; char *temp_ptr; char *temp_ptr2; char input[8096]; int notify_recovery; int notify_warning; int notify_critical; int notify_down; int notify_unreachable; int option; int have_template = 0; int x = 0, y = 0; char *host_name; char *service_description; char *host_name2; char *service_description2; if(argc != 3) { printf("Nagios Config File Converter\n"); printf("Written by Ethan Galstad (egalstad@nagios.org)\n"); printf("Last Modified: 08-12-2005\n"); printf("\n"); printf("Usage: %s \n", argv[0]); printf("\n"); printf("Valid object types include:\n"); printf("\n"); printf("\ttimeperiods\n"); printf("\tcommands\n"); printf("\tcontacts\n"); printf("\tcontactgroups\n"); printf("\thosts\n"); printf("\thostgroups\n"); printf("\thostgroupescalations\n"); printf("\tservices\n"); printf("\tservicedependencies\n"); printf("\tserviceescalations\n"); printf("\n"); printf("\thostextinfo\n"); printf("\tserviceextinfo\n"); printf("\n"); printf("Notes:\n"); printf("\n"); printf("This utility is designed to aide you in converting your old 'host'\n"); printf("config file(s) to the new template-based config file style. It is\n"); printf("also capable of converting extended host and service information\n"); printf("definitions in your old CGI config file.\n"); printf("\n"); printf("Supply the name of your old 'host' config file (or your old CGI config\n"); printf("file if you're converting extended host/service definitions) on the\n"); printf("command line, along with the type of object you would like to produce\n"); printf("a new config file for. Your old config file is not overwritten - new\n"); printf("configuration data is printed to standard output, so you can redirect it\n"); printf("wherever you like.\n"); printf("\n"); printf("Please note that you can only specify one type of object at a time\n"); printf("on the command line.\n"); printf("\n"); printf("IMPORTANT: This utility will generate Nagios 1.x compliant config files.\n"); printf("However, the config files are not totally compatible with Nagios 2.x, so\n"); printf("you will have to do some manual tweaking.\n"); printf("\n"); return -1; } fp = fopen(argv[1], "r"); if(fp == NULL) { printf("Error: Could not open file '%s' for reading.\n", argv[1]); return -1; } for(fgets(input, sizeof(input) - 1, fp); !feof(fp); fgets(input, sizeof(input) - 1, fp)) { /* skip blank lines and comments */ if(input[0] == '#' || input[0] == '\x0' || input[0] == '\n' || input[0] == '\r') continue; /* timeperiods */ if(strstr(input, "timeperiod[") && !strcmp(argv[2], "timeperiods")) { temp_ptr2 = &input[0]; temp_ptr = my_strsep(&temp_ptr2, "["); temp_ptr = my_strsep(&temp_ptr2, "]"); printf("# '%s' timeperiod definition\n", temp_ptr); printf("define timeperiod{\n"); /*printf("\tname\t\t%s\n",temp_ptr);*/ printf("\ttimeperiod_name\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); printf("\talias\t\t%s\n", temp_ptr + 1); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\tsunday\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\tmonday\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\ttuesday\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\twednesday\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\tthursday\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\tfriday\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";\r\n"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\tsaturday\t%s\n", temp_ptr); printf("\t}\n\n\n"); } /* commands */ if(strstr(input, "command[") && !strcmp(argv[2], "commands")) { temp_ptr = strtok(input, "["); temp_ptr = strtok(NULL, "]"); printf("# '%s' command definition\n", temp_ptr); printf("define command{\n"); /*printf("\tname\t\t%s\n",temp_ptr);*/ printf("\tcommand_name\t%s\n", temp_ptr); temp_ptr = strtok(NULL, "\n"); printf("\tcommand_line\t%s\n", temp_ptr + 1); printf("\t}\n\n\n"); } /* contacts */ if(strstr(input, "contact[") && !strcmp(argv[2], "contacts")) { temp_ptr2 = &input[0]; temp_ptr = my_strsep(&temp_ptr2, "["); temp_ptr = my_strsep(&temp_ptr2, "]"); printf("# '%s' contact definition\n", temp_ptr); printf("define contact{\n"); /*printf("\tname\t\t\t\t%s\n",temp_ptr);*/ printf("\tcontact_name\t\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); printf("\talias\t\t\t\t%s\n", temp_ptr + 1); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\tservice_notification_period\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\thost_notification_period\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); notify_recovery = atoi(temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); notify_critical = atoi(temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); notify_warning = atoi(temp_ptr); option = 0; printf("\tservice_notification_options\t"); if(notify_recovery == 1 || notify_critical == 1 || notify_warning == 1) { if(notify_warning == 1) { printf("w,u"); option = 1; } if(notify_critical == 1) { if(option == 1) printf(","); printf("c"); option = 1; } if(notify_recovery == 1) { if(option == 1) printf(","); printf("r"); } } else printf("n"); printf("\n"); temp_ptr = my_strsep(&temp_ptr2, ";"); notify_recovery = atoi(temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); notify_down = atoi(temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); notify_unreachable = atoi(temp_ptr); option = 0; printf("\thost_notification_options\t"); if(notify_recovery == 1 || notify_down == 1 || notify_unreachable == 1) { if(notify_down == 1) { printf("d"); option = 1; } if(notify_unreachable == 1) { if(option == 1) printf(","); printf("u"); option = 1; } if(notify_recovery == 1) { if(option == 1) printf(","); printf("r"); } } else printf("n"); printf("\n"); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\tservice_notification_commands\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\thost_notification_commands\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\temail\t\t\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";\r\n"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\tpager\t\t\t\t%s\n", temp_ptr); printf("\t}\n\n\n"); } /* contactgroups */ if(strstr(input, "contactgroup[") && !strcmp(argv[2], "contactgroups")) { temp_ptr = strtok(input, "["); temp_ptr = strtok(NULL, "]"); printf("# '%s' contact group definition\n", temp_ptr); printf("define contactgroup{\n"); /*printf("\tname\t\t\t%s\n",temp_ptr);*/ printf("\tcontactgroup_name\t%s\n", temp_ptr); temp_ptr = strtok(NULL, ";"); printf("\talias\t\t\t%s\n", temp_ptr + 1); temp_ptr = strtok(NULL, "\n"); printf("\tmembers\t\t\t%s\n", temp_ptr); printf("\t}\n\n\n"); } /* hosts */ if(strstr(input, "host[") && !strcmp(argv[2], "hosts")) { if(have_template == 0) { printf("# Generic host definition template\n"); printf("define host{\n"); printf("\tname\t\t\t\tgeneric-host\t; The name of this host template - referenced in other host definitions, used for template recursion/resolution\n"); printf("\tactive_checks_enabled\t\t1\t; Active host checks are enabled\n"); printf("\tpassive_checks_enabled\t\t1\t; Passive host checks are enabled/accepted\n"); printf("\tnotifications_enabled\t\t1\t; Host notifications are enabled\n"); printf("\tevent_handler_enabled\t\t1\t; Host event handler is enabled\n"); printf("\tflap_detection_enabled\t\t1\t; Flap detection is enabled\n"); printf("\tprocess_perf_data\t\t1\t; Process performance data\n"); printf("\tretain_status_information\t1\t; Retain status information across program restarts\n"); printf("\tretain_nonstatus_information\t1\t; Retain non-status information across program restarts\n"); printf("\n"); printf("\tregister\t\t\t0\t; DON'T REGISTER THIS DEFINITION - ITS NOT A REAL HOST, JUST A TEMPLATE!\n"); printf("\t}\n\n"); have_template = 1; } temp_ptr2 = &input[0]; temp_ptr = my_strsep(&temp_ptr2, "["); temp_ptr = my_strsep(&temp_ptr2, "]"); printf("# '%s' host definition\n", temp_ptr); printf("define host{\n"); printf("\tuse\t\t\tgeneric-host\t\t; Name of host template to use\n\n"); printf("\thost_name\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); printf("\talias\t\t\t%s\n", temp_ptr + 1); temp_ptr = my_strsep(&temp_ptr2, ";"); printf("\taddress\t\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\tparents\t\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\tcheck_command\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); printf("\tmax_check_attempts\t%d\n", atoi(temp_ptr)); temp_ptr = my_strsep(&temp_ptr2, ";"); printf("\tnotification_interval\t%d\n", atoi(temp_ptr)); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\tnotification_period\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); notify_recovery = atoi(temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); notify_down = atoi(temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); notify_unreachable = atoi(temp_ptr); option = 0; printf("\tnotification_options\t"); if(notify_recovery == 1 || notify_down == 1 || notify_unreachable == 1) { if(notify_down == 1) { printf("d"); option = 1; } if(notify_unreachable == 1) { if(option == 1) printf(","); printf("u"); option = 1; } if(notify_recovery == 1) { if(option == 1) printf(","); printf("r"); } } else printf("n"); printf("\n"); temp_ptr = my_strsep(&temp_ptr2, ";\r\n"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\tevent_handler\t\t%s\n", temp_ptr); printf("\t}\n\n\n"); } /* hostgroups */ if(strstr(input, "hostgroup[") && !strcmp(argv[2], "hostgroups")) { temp_ptr = strtok(input, "["); temp_ptr = strtok(NULL, "]"); printf("# '%s' host group definition\n", temp_ptr); printf("define hostgroup{\n"); /*printf("\tname\t\t%s\n",temp_ptr);*/ printf("\thostgroup_name\t%s\n", temp_ptr); temp_ptr = strtok(NULL, ";"); printf("\talias\t\t%s\n", temp_ptr + 1); temp_ptr = strtok(NULL, ";"); /*printf("\tcontact_groups\t%s\n",temp_ptr);*/ temp_ptr = strtok(NULL, "\n"); printf("\tmembers\t\t%s\n", temp_ptr); printf("\t}\n\n\n"); } /* services */ if(strstr(input, "service[") && !strcmp(argv[2], "services")) { if(have_template == 0) { printf("# Generic service definition template\n"); printf("define service{\n"); printf("\tname\t\t\t\tgeneric-service\t; The 'name' of this service template, referenced in other service definitions\n"); printf("\tactive_checks_enabled\t\t1\t; Active service checks are enabled\n"); printf("\tpassive_checks_enabled\t\t1\t; Passive service checks are enabled/accepted\n"); printf("\tparallelize_check\t\t1\t; Active service checks should be parallelized (disabling this can lead to major performance problems)\n"); printf("\tobsess_over_service\t\t1\t; We should obsess over this service (if necessary)\n"); printf("\tcheck_freshness\t\t\t0\t; Default is to NOT check service 'freshness'\n"); printf("\tnotifications_enabled\t\t1\t; Service notifications are enabled\n"); printf("\tevent_handler_enabled\t\t1\t; Service event handler is enabled\n"); printf("\tflap_detection_enabled\t\t1\t; Flap detection is enabled\n"); printf("\tprocess_perf_data\t\t1\t; Process performance data\n"); printf("\tretain_status_information\t1\t; Retain status information across program restarts\n"); printf("\tretain_nonstatus_information\t1\t; Retain non-status information across program restarts\n"); printf("\n"); printf("\tregister\t\t\t0\t; DON'T REGISTER THIS DEFINITION - ITS NOT A REAL SERVICE, JUST A TEMPLATE!\n"); printf("\t}\n\n"); have_template = 1; } temp_ptr2 = &input[0]; temp_ptr = my_strsep(&temp_ptr2, "["); temp_ptr = my_strsep(&temp_ptr2, "]"); printf("# Service definition\n"); printf("define service{\n"); printf("\tuse\t\t\t\tgeneric-service\t\t; Name of service template to use\n\n"); printf("\thost_name\t\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); printf("\tservice_description\t\t%s\n", temp_ptr + 1); temp_ptr = my_strsep(&temp_ptr2, ";"); printf("\tis_volatile\t\t\t%d\n", atoi(temp_ptr)); temp_ptr = my_strsep(&temp_ptr2, ";"); printf("\tcheck_period\t\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); printf("\tmax_check_attempts\t\t%d\n", atoi(temp_ptr)); temp_ptr = my_strsep(&temp_ptr2, ";"); printf("\tnormal_check_interval\t\t%d\n", atoi(temp_ptr)); temp_ptr = my_strsep(&temp_ptr2, ";"); printf("\tretry_check_interval\t\t%d\n", atoi(temp_ptr)); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\tcontact_groups\t\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); printf("\tnotification_interval\t\t%d\n", atoi(temp_ptr)); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\tnotification_period\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); notify_recovery = atoi(temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); notify_critical = atoi(temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); notify_warning = atoi(temp_ptr); option = 0; printf("\tnotification_options\t\t"); if(notify_recovery == 1 || notify_critical == 1 || notify_warning == 1) { if(notify_warning == 1) { printf("w,u"); option = 1; } if(notify_critical == 1) { if(option == 1) printf(","); printf("c"); option = 1; } if(notify_recovery == 1) { if(option == 1) printf(","); printf("r"); } } else printf("n"); printf("\n"); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\tevent_handler\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";\r\n"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\tcheck_command\t\t\t%s\n", temp_ptr); printf("\t}\n\n\n"); } /* hostgroup escalations */ if(strstr(input, "hostgroupescalation[") && !strcmp(argv[2], "hostgroupescalations")) { x++; temp_ptr2 = &input[0]; temp_ptr = my_strsep(&temp_ptr2, "["); temp_ptr = my_strsep(&temp_ptr2, "]"); printf("# Hostgroup '%s' escalation definition\n", temp_ptr); printf("define hostgroupescalation{\n"); printf("\thostgroup_name\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, "-"); printf("\tfirst_notification\t\t%d\n", atoi(temp_ptr + 1)); temp_ptr = my_strsep(&temp_ptr2, ";"); printf("\tlast_notification\t\t%d\n", atoi(temp_ptr)); temp_ptr = my_strsep(&temp_ptr2, ";"); printf("\tcontact_groups\t\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";\r\n"); printf("\tnotification_interval\t\t%d\n", atoi(temp_ptr)); printf("\t}\n\n\n"); } /* service escalations */ if(strstr(input, "serviceescalation[") && !strcmp(argv[2], "serviceescalations")) { x++; printf("# Serviceescalation definition\n"); printf("define serviceescalation{\n"); temp_ptr2 = &input[0]; temp_ptr = my_strsep(&temp_ptr2, "["); host_name = my_strsep(&temp_ptr2, ";"); service_description = my_strsep(&temp_ptr2, "]"); printf("\thost_name\t\t%s\n", host_name); printf("\tservice_description\t\t%s\n", service_description); temp_ptr = my_strsep(&temp_ptr2, "-"); printf("\tfirst_notification\t\t%d\n", atoi(temp_ptr + 1)); temp_ptr = my_strsep(&temp_ptr2, ";"); printf("\tlast_notification\t\t%d\n", atoi(temp_ptr)); temp_ptr = my_strsep(&temp_ptr2, ";"); printf("\tcontact_groups\t\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";\r\n"); printf("\tnotification_interval\t\t%d\n", atoi(temp_ptr)); printf("\t}\n\n\n"); } /* service dependencies */ if(strstr(input, "servicedependency[") && !strcmp(argv[2], "servicedependencies")) { temp_ptr2 = &input[0]; temp_ptr = my_strsep(&temp_ptr2, "["); host_name = my_strsep(&temp_ptr2, ";"); service_description = my_strsep(&temp_ptr2, "]"); host_name2 = my_strsep(&temp_ptr2, ";") + 1; service_description2 = my_strsep(&temp_ptr2, ";"); temp_ptr = my_strsep(&temp_ptr2, ";"); x++; printf("# Servicedependency definition\n"); printf("define servicedependency{\n"); printf("\thost_name\t\t\t%s\n", host_name2); printf("\tservice_description\t\t%s\n", service_description2); printf("\tdependent_host_name\t\t%s\n", host_name); printf("\tdependent_service_description\t%s\n", service_description); printf("\texecution_failure_criteria\t"); for(y = 0; temp_ptr[y] != '\x0'; y++) printf("%s%c", (y > 0) ? "," : "", temp_ptr[y]); if(y == 0) printf("n"); printf("\t; These are the criteria for which check execution will be suppressed\n"); temp_ptr = my_strsep(&temp_ptr2, ";\r\n"); printf("\tnotification_failure_criteria\t"); for(y = 0; temp_ptr[y] != '\x0'; y++) printf("%s%c", (y > 0) ? "," : "", temp_ptr[y]); if(y == 0) printf("n"); printf("\t; These are the criteria for which notifications will be suppressed\n"); printf("\t}\n\n\n"); } /* extended host info */ if(strstr(input, "hostextinfo[") && !strcmp(argv[2], "hostextinfo")) { temp_ptr2 = &input[0]; temp_ptr = my_strsep(&temp_ptr2, "["); temp_ptr = my_strsep(&temp_ptr2, "]"); printf("# '%s' hostextinfo definition\n", temp_ptr); printf("define hostextinfo{\n"); printf("\thost_name\t\t%s\t\t; The name of the host this data is associated with\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr + 1 != NULL && strcmp(temp_ptr + 1, "")) printf("\tnotes_url\t\t\t%s\n", temp_ptr + 1); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\ticon_image\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\tvrml_image\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\tstatusmap_image\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\ticon_image_alt\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\t2d_coords\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";\r\n"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\t3d_coords\t\t%s\n", temp_ptr); printf("\t}\n\n\n"); } /* extended service info */ if(strstr(input, "serviceextinfo[") && !strcmp(argv[2], "serviceextinfo")) { temp_ptr2 = &input[0]; temp_ptr = my_strsep(&temp_ptr2, "["); temp_ptr = my_strsep(&temp_ptr2, ";"); printf("# '%s' serviceextinfo definition\n", temp_ptr); printf("define serviceextinfo{\n"); printf("\thost_name\t\t%s\t\t; The name of the service this data is associated with\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, "]"); printf("\tservice_description\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr + 1 != NULL && strcmp(temp_ptr + 1, "")) printf("\tnotes_url\t\t%s\n", temp_ptr + 1); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\ticon_image\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";\r\n"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\ticon_image_alt\t\t%s\n", temp_ptr); printf("\t}\n\n\n"); } } fclose(fp); return 0; } /* fixes compiler problems under Solaris, since strsep() isn't included */ /* this code is taken from the glibc source */ char *my_strsep(char **stringp, const char *delim) { char *begin, *end; begin = *stringp; if(begin == NULL) return NULL; /* A frequent case is when the delimiter string contains only one character. Here we don't need to call the expensive `strpbrk' function and instead work using `strchr'. */ if(delim[0] == '\0' || delim[1] == '\0') { char ch = delim[0]; if(ch == '\0') end = NULL; else { if(*begin == ch) end = begin; else end = strchr(begin + 1, ch); } } else /* Find the end of the token. */ end = strpbrk(begin, delim); if(end) { /* Terminate the token and set *STRINGP past NUL character. */ *end++ = '\0'; *stringp = end; } else /* No more delimiters; this is the last token. */ *stringp = NULL; return begin; }