int main(int argc, char ** argv) { int nb, len, ram; char input[128] = "test-1200K.xml"; if(argc < 2) { printf("no input file use '%s'\n", input); } else { strncpy(input, argv[1], 128); } FILE * f = fopen(input, "r"); if(f) { fseek(f, 0, SEEK_END); len = ftell(f); fclose(f); } else { printf("input file doesnt exist\n"); return 1; } node_t *root = roxml_load_doc(input); int pgsize = 0; int size = 0; int resident = 0; int share = 0; int text = 0; int lib = 0; int data = 0; int dt = 0; char statfile[512]; sprintf(statfile, "/proc/%d/statm", getpid()); FILE * fstatfile = fopen(statfile, "r"); if(fstatfile) { fscanf(fstatfile, "%d %d %d %d %d %d %d", &size, &resident, &share, &text, &lib, &data, &dt); fclose(fstatfile); } pgsize = getpagesize(); ram = pgsize*resident; node_t ** set = roxml_xpath(root, "//*", &nb); roxml_release(set); roxml_close(root); printf("stats for '%s':\n", input); printf("\tload_doc: %d bytes\n", len); printf("\txpath processed %d nodes\n", nb); printf("\ttotal node:\t\t\t %u\n",_nb_node); printf("\ttotal attr:\t\t\t %u\n",_nb_attr); printf("\ttotal text:\t\t\t %u\n",_nb_text); printf("\tram tree:\t\t\t %lu bytes\n",(long unsigned int)sizeof(node_t)*(_nb_node+_nb_attr+_nb_text)); printf("\tram total:\t\t\t %d bytes\n",ram); printf("\tram ratio:\t\t\t %f\n",(float)(sizeof(node_t)*(_nb_node+_nb_attr+_nb_text))/(float)len); return 0; }
int XHCP_loadConfig (node_t* argXmlConfig) { node_t **result; int nb_result; char buffer[XHCP_BUFFER_SZ]; int sz_buffer; char *xhcp_fileName; printf ("Loading XHCP server configuration...\n"); if ( (xhcp_fileName = XHCP_getConfigFile ()) != NULL ) domConfig = roxml_load_doc (xhcp_fileName); else if ( argXmlConfig != NULL ) domConfig = argXmlConfig; else Error_Quit ("Unable to find XHCP configuration"); /* Time Out */ result = roxml_xpath ( domConfig, "//XHCPserver/ConnectionTimeOut[@delay]", &nb_result); if ( nb_result == 1 ) { char *zaza = roxml_get_content ( roxml_get_attr (result[0], "delay", 0), buffer, XHCP_BUFFER_SZ, &sz_buffer ); XHCP_connexionTimeOut = atoi (zaza); if ( XHCP_connexionTimeOut <= 0 ) XHCP_connexionTimeOut=2; } else if ( nb_result == 0) { XHCP_connexionTimeOut = 5; } else Error_Quit ("Erroe parsing XHCP config file (ConnectionTimeOut)"); roxml_release (RELEASE_LAST); printf ("XHCP_connexionTimeOut = %d\n", XHCP_connexionTimeOut); return 0; }
void timeEvent(time_t *time) { node_t **determLst; int nbDetermLst; int anyRule; int i; /* On recherche tous les determinators contenant des conditions de temps */ determLst = roxml_xpath ( rootConfig, "//timeCondition/ancestor-or-self::determinator", &nbDetermLst); for ( i=0; i<nbDetermLst; i++) { int ret; /* Type de gestion des rêgles */ char *rule=xmlGetAttribut (determLst[i], "input", "match", FALSE); anyRule = ! strcasecmp(rule,"any"); //ret = rules_verifTimeConditions( determLst[i], anyRule, tickDate, tickYear, tickMonth, tickDay, tickTime); //ret = rules_verifTimeConditions( determLst[i], anyRule, time); if ( ret ) { printf ("Le derterminator doit être executé\n"); rules_executeActions(determLst[i]); // if ( anyRule ) // rules_executeActions(determLst[i]); // else // { // if (rules_verifAllConditions(determLst[i], /*TIME_EVENT*/ 0) ) // rules_executeActions(determLst[i]); // } } } }
int XHCPcmd_GETRULE (int sockd, int argc, char **argv) { node_t **rulesNodesLst; char buffer[XHCP_BUFFER_SZ]; int sz_buffer; int nb; char *writeBuffer = NULL; if (argc != 2) { XHCP_printXHCPResponse (sockd, RES_SYNTAXERR ); // Syntax Error return XHCP_EXE_ERROR; } sprintf (buffer, "//determinator[@guid='%s']", argv[1]); printf ("%s\n", buffer); if ( (rulesNodesLst = roxml_xpath (rootConfig, buffer, &nb )) == NULL ) XHCP_printXHCPResponse (sockd, RES_NOSUCHSCR ); // No such script/rule else { XHCP_printXHCPResponse (sockd, RES_REQSCRFOL ); // Requested script/rule follows sz_buffer = roxml_commit_changes (rulesNodesLst[0], NULL, &writeBuffer, 1); XHCP_print (sockd, writeBuffer); XHCP_print (sockd, "."); free (writeBuffer); } return XHCP_EXE_SUCCESS; }
int XHCPcmd_LISTGLOBALS (int sockd, int argc, char **argv) { node_t **globalsLst; char buffer[XHCP_BUFFER_SZ]; int sz_buffer; int i, nb; XHCP_printXHCPResponse (sockd, RES_LSTGLVFOL ); // List of global variables follows if ( (globalsLst = roxml_xpath (rootConfig, "//global", &nb )) !=NULL ) { for (i=0; i<nb; i++) { char *champ1 = roxml_get_content ( roxml_get_attr (globalsLst[i], "name", 0), buffer, XHCP_BUFFER_SZ, &sz_buffer ); char *champ2 = roxml_get_content ( roxml_get_attr (globalsLst[i], "value", 0), champ1 + sz_buffer + 1, XHCP_BUFFER_SZ, &sz_buffer ); XHCP_print (sockd, "%s=%s", champ1, champ2); } } XHCP_print (sockd, "."); return XHCP_EXE_SUCCESS; }
int XHCPcmd_LISTRULES (int sockd, int argc, char **argv) { node_t **rulesNodesLst; char buffer[XHCP_BUFFER_SZ]; int sz_buffer; int i, nb; XHCP_printXHCPResponse (sockd, RES_LSTDTRFOL ); // List of Determinator Rules follows if ( (rulesNodesLst = roxml_xpath (rootConfig, "//determinator", &nb )) !=NULL ) { for (i=0; i<nb; i++) { char *champ1 = roxml_get_content ( roxml_get_attr (rulesNodesLst[i], "guid", 0), buffer, XHCP_BUFFER_SZ, &sz_buffer ); char *champ2 = roxml_get_content ( roxml_get_attr (rulesNodesLst[i], "name", 0), champ1 + sz_buffer + 1, XHCP_BUFFER_SZ, &sz_buffer ); char *champ3 = roxml_get_content ( roxml_get_attr (rulesNodesLst[i], "enabled", 0), champ2 + sz_buffer + 1, XHCP_BUFFER_SZ, &sz_buffer ); XHCP_print (sockd, "%s\t%s\t%s", champ1, champ2, champ3); } } XHCP_print (sockd, "."); return XHCP_EXE_SUCCESS; }
int XHCPcmd_DELGLOBAL (int sockd, int argc, char **argv) { node_t **globalsLst; char buffer[XHCP_BUFFER_SZ]; int sz_buffer; int nb; if (argc != 2) { XHCP_printXHCPResponse (sockd, RES_SYNTAXERR ); // Syntax Error return XHCP_EXE_ERROR; } sprintf (buffer, "//globals/global[@name='%s']", argv[1]); printf ("%s\n", buffer); if ( (globalsLst = roxml_xpath (rootConfig, buffer, &nb )) == NULL ) XHCP_printXHCPResponse (sockd, RES_NOSUCHGLO ); // No such global else { roxml_del_node (globalsLst[0]); saveHal4lConfig (HAL4L_getConfigFile ()); loadHal4lConfig (HAL4L_getConfigFile ()); XHCP_printXHCPResponse (sockd, RES_GLOVALDEL ); //233, "Global variable deleted" } return XHCP_EXE_SUCCESS; }
int XHCPcmd_DELRULE (int sockd, int argc, char **argv) { node_t **rulesNodesLst; char buffer[XHCP_BUFFER_SZ]; int sz_buffer; int nb; if (argc != 2) { XHCP_printXHCPResponse (sockd, RES_SYNTAXERR ); // Syntax Error return XHCP_EXE_ERROR; } sprintf (buffer, "//determinator[@guid='%s']", argv[1]); printf ("%s\n", buffer); if ( (rulesNodesLst = roxml_xpath (rootConfig, buffer, &nb )) == NULL ) XHCP_printXHCPResponse (sockd, RES_NOSUCHSCR ); // No such script/rule else { roxml_del_node (rulesNodesLst[0]); saveHal4lConfig (HAL4L_getConfigFile ()); loadHal4lConfig (HAL4L_getConfigFile ()); XHCP_printXHCPResponse (sockd, RES_SCRSUCDEL ); // Script/rule successfully deleted } return XHCP_EXE_SUCCESS; }
int XHCPcmd_SETRULE_handle (int sockd, int argc, char **argv, char *data) { node_t *nTmp; node_t **lstNodes; char *newId = NULL; int nb; // A supprimer !!! char *zaza = NULL; printf ("Entree XHCPcmd_SETRULE_handle avec %d arguments\n", argc); int i; for ( i=0; i<argc; i++ ) printf ( "%d - %s\n", i, argv[i]); if ( (nTmp = roxml_load_buf (data)) == NULL ) { XHCP_printXHCPResponse (sockd, RES_SYNTAXERR); // Syntax Error return XHCP_EXE_ERROR; } printf ("Chargement XML OK\n"); if ( argc == 2 ) // pas de node mais id donné en argument newId = strdup(argv[1]); // On recherche si un id est présent if ( (lstNodes = roxml_xpath (nTmp, "//determinator[@guid]", &nb )) != NULL ) { node_t *attr_tmp = roxml_get_attr (lstNodes[0], "guid", 0); if ( newId == NULL && argc == 1 ) { newId = roxml_get_content(attr_tmp, NULL, 0, NULL); } roxml_del_node(attr_tmp); } if ( newId == NULL ) newId = XHCP_getUuid(); printf("a la fin id = %s\n",newId==NULL ? "NULL":newId); lstNodes = roxml_xpath (nTmp, "//determinator", &nb ); if ( nb == 1 ) nTmp = lstNodes[0]; else { printf("Pas trouve //derterminator, nb=%d\n",nb); XHCP_printXHCPResponse (sockd, RES_SYNTAXERR); // Syntax Error return XHCP_EXE_ERROR; } // Ajout d'un nouveau noeud roxml_add_node(nTmp, 0, ROXML_ATTR_NODE, "guid", newId); printf("attribut ajouté\n"); printf("Nouvel arbre determinator\n"); roxml_commit_changes (nTmp, NULL, &zaza, 1); printf("%s\n", zaza); free(zaza); lstNodes = roxml_xpath (rootConfig, "//determinators", &nb ); if ( nb != 1 ) { printf("Pas trouve //determinators, nb=%d\n",nb); XHCP_printXHCPResponse (sockd, RES_INTNERROR); // Internal error return XHCP_EXE_ERROR; } /* On ratache le nouveau determinator à la liste */ roxml_parent_node(lstNodes[0], nTmp); saveHal4lConfig (HAL4L_getConfigFile ()); //roxml_close (nTmp); loadHal4lConfig (HAL4L_getConfigFile ()); free(newId); XHCP_printXHCPResponse (sockd, RES_CFGDOCUPL ); // Configuration document uploaded return XHCP_EXE_SUCCESS; }
int main(int ac, char *av[]) { node_t *doc; char *xmlname = NULL; char *xpquery = NULL; node_t **xpr = NULL; int opt = 0; int longopt = 0; int flags = 0; /* getopt_long() should not display any message */ opterr = 0; while ((opt = getopt_long(ac, av, short_options, long_options, &longopt)) != -1) { switch (opt) { case 0: /* long option encountered we should not see any of them, because they are supposed to map to the corresponding short option. So if we get this, it might indicate that something is borked. */ break; case 1: /* not an option */ if (!xmlname) { xmlname = strdup(av[optind-1]); } else if (!xpquery) { xpquery = strdup(av[optind-1]); } else { fprintf(stderr, "too many non-option - remove '%s'\n", av[optind - 1]); return EXIT_FAILURE; } break; case 'h': display_usage(av[0]); return EXIT_FAILURE; case 'q': flags |= ROCAT_FLAG_QUIET; break; case '?': fprintf(stderr, "unknown option '%s'\n", av[optind - 1]); return EXIT_FAILURE; default: break; } } if (!xmlname) { if ((flags & ROCAT_FLAG_QUIET) == 0) { fprintf(stderr, "invalid options: no XML file name\n\n"); display_usage(av[0]); } return EXIT_FAILURE; } doc = roxml_load_doc(xmlname); if (!doc) { if ((flags & ROCAT_FLAG_QUIET) == 0) fprintf(stderr, "failed to load XML file '%s'\n", xmlname); goto on_error; } if (xpquery) { int xncount; xpr = roxml_xpath(doc, xpquery, &xncount); if (!xpr) { if ((flags & ROCAT_FLAG_QUIET) == 0) fprintf(stderr, "XPath query '%s' failed on '%s'\n", xpquery, xmlname); goto on_error; } if (xncount) { int npos; for (npos = 0; npos < xncount; ++npos) { char *buffer = NULL; node_t *xn = xpr[npos];; /* commit the node to stdout */ roxml_commit_changes(xn, NULL, &buffer, 1); printf("%s\n", buffer); free(buffer); } } else { if ((flags & ROCAT_FLAG_QUIET) == 0) fprintf(stderr, "XPath query '%s' does not yield to any result\n", xpquery); goto on_error; } roxml_release(xpr); free(xpquery); } else { char *buffer = NULL; /* commit everything to stdout */ roxml_commit_changes(doc, NULL, &buffer, 1); printf("%s\n", buffer); free(buffer); } roxml_close(doc); free(xmlname); return EXIT_SUCCESS; on_error: if (xpr) { roxml_release(xpr); } if (doc) roxml_close(doc); if (xmlname) free(xmlname); if (xpquery) free(xpquery); return EXIT_FAILURE; }