summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/priority.c132
1 files changed, 132 insertions, 0 deletions
diff --git a/src/priority.c b/src/priority.c
new file mode 100644
index 0000000..3b113f3
--- /dev/null
+++ b/src/priority.c
@@ -0,0 +1,132 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <syslog.h>
+#include <dirent.h>
+#include <sys/time.h>
+#include <string.h>
+
+
+void recurse(char *cur_dir,FILE *out);
+
+/**
+ *
+ *
+ **/
+void
+usage(void)
+{
+ printf("priority: recurses templates and generates priority file\n");
+ printf("\t-h\thelp\n");
+ printf("\t-f\toutput file\n");
+}
+
+
+/**
+ *
+ *
+ **/
+int
+main(int argc, char** argv)
+{
+ int ch;
+ char *filename = NULL;
+
+ //grab inputs
+ while ((ch = getopt(argc, argv, "hf:")) != -1) {
+ switch (ch) {
+ case 'h':
+ usage();
+ exit(0);
+ case 'f':
+ filename = optarg;
+ //GET OUT FILE HERE
+ }
+
+ if (filename == NULL) {
+ strcpy(filename,"priority");
+ }
+
+ FILE *fp = fopen(filename,"w");
+ if (fp == NULL) {
+ printf("cannot open priority file. exiting...\n");
+ }
+
+ char root_dir[2048] = "";
+ recurse(root_dir,fp);
+ fclose(fp);
+ }
+}
+
+
+/**
+ * On each priority node write out location and value and continue recursion
+ *
+ **/
+void
+recurse(char *cur_dir,FILE *out)
+{
+ char root_path[] = "/opt/vyatta/share/vyatta-cfg/templates";
+ char str[2048];
+ //open and scan node.def
+
+ char file[2048];
+ sprintf(file,"%s/%s/node.def",root_path,cur_dir);
+ FILE *fp = fopen(file,"r");
+ // printf("found node.def at: %s\n",file);
+
+ if (fp != NULL) {
+ while (fgets(str, 1024, fp) != 0) {
+ if (strncmp("priority:",str,9) == 0) {
+ //retrieve value and write out...
+
+ const char delimiters[] = " ";
+ char *running;
+ char *token;
+
+ running = strdup(str);
+ token = strsep(&running, delimiters);
+ token = strsep(&running, delimiters);
+
+ unsigned long val = strtoul(token,NULL,10);
+ if (val > 0 && val <= 1000) {
+ fwrite(token,1,strlen(token)-1,out);
+ fwrite(" ",1,1,out);
+
+ //remove fixed path
+ //offset by 1 to remove the leading slash
+ fwrite(cur_dir+1,1,strlen(cur_dir)-1,out);
+ fwrite("\n",1,1,out);
+ }
+ break;
+ }
+ }
+ fclose(fp);
+ }
+
+
+ //now recurse the other directories here.
+ //iterate over directory here
+
+ char path[2048];
+ sprintf(path,"%s/%s",root_path,cur_dir);
+ DIR *dp;
+ if ((dp = opendir(path)) == NULL) {
+ return;
+ }
+
+ //finally iterate over valid child directory entries
+ struct dirent *dirp = NULL;
+ while ((dirp = readdir(dp)) != NULL) {
+ if (strcmp(dirp->d_name, ".") != 0 &&
+ strcmp(dirp->d_name, "..") != 0 &&
+ strcmp(dirp->d_name, "node.def") != 0) {
+ char local_dir[2048];
+ strcpy(local_dir,cur_dir);
+ strcat(local_dir,"/");
+ strcat(local_dir,dirp->d_name);
+ recurse(local_dir,out);
+ }
+ }
+ closedir(dp);
+}