/********************************************************** * BiffSocko * sortcsv.c * * takes the comma delimmited csv file in arg1, and * traverses through each line trying to sort the comma * delimited file in arg2, and creates a sorted comma * delimited file (arg3) * * the files are being sorted by the first field * * this is normally used for syncing the Group.csv to the * GroupSharedUserMap.csv or the Role.csv to the GroupRoleMap.csv * * USAGE: * sortcsv<[ROLE|GROUP]> * * EXIT CODES: * 0 - Success * 1 - error * * COMPILE INSTRUCTIONS: * gcc -o sortcsv sortcsv.c **********************************************************/ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<strings.h> #define MAX 1024 #define usage "[Group.csv|Role.csv] [GroupSharedUserMap.csv|GroupRoleMap.csv] [outputfile] [GROUP|ROLE]" int main(int argc, char *argv[]){ FILE *GRP = '\0'; /* File Descripter for group.csv */ FILE *GRPSHR = '\0'; /* File Descripter for GroupSharedUserMap.csv */ FILE *NEWGRPSHR = '\0'; /* File Descripter for newGroupSharedUserMap */ char GROUPSHAREFILE[MAX]; /* filename */ char NEWGROUPSHARE[MAX]; /* filename */ char GROUP[MAX]; /* filename */ char matchstr[MAX]; /* String from group.csv to match */ char lnstr[MAX]; /* String from GroupSharedUserMap.csv */ char tmpstr[MAX]; /* temp String */ char substr1[MAX]; /* substring (groupname) */ char substr2[MAX]; /* substring (groupname) */ char *seperator = ","; /* token for strtok */ char *tokenptr; /* strtok pointer for string1 */ char *tokenptr2; /* strtok pointer for string2 */ char *prog=argv[0]; /* program name */ char header[MAX]; /* holds role or group header */ /******************************************* * check command line args *******************************************/ if(argc != 5){ fprintf(stderr, "usage: %s %s\n",prog, usage); /* get out till you learn how to use this */ exit(1); } strcpy(GROUP, argv[1]); strcpy(GROUPSHAREFILE, argv[2]); strcpy(NEWGROUPSHARE, argv[3]); /******************************************* * set up the role or group csv header *******************************************/ if(strcasecmp(argv[4],"ROLE") == 0){ strcpy(header, "Parent.UniqueName,UniqueName"); }else{ if(strcasecmp(argv[4],"GROUP") == 0){ strcpy(header, "Parent.UniqueName,UniqueName,PasswordAdapter"); }else{ fprintf(stderr, "usage: %s %s\n",prog, usage); /* get out till you learn how to use this */ exit(1); } } /******************************************* * open up all the files *******************************************/ if(!(GRP = fopen(GROUP,"r"))){ printf("cant open %s to read\n",GROUP); exit(1); } if(!(NEWGRPSHR = fopen(NEWGROUPSHARE, "a"))){ printf("cant open %s to write\n",NEWGROUPSHARE); fclose(GRP); fclose(GRPSHR); exit(1); } fprintf(NEWGRPSHR, "%s\n",header); fflush(NEWGRPSHR); /******************************************* * traverse through Group.csv file *******************************************/ while(fgets(matchstr, MAX, GRP)){ tokenptr = strtok(matchstr,seperator); sprintf(substr1,"%s",tokenptr); /******************************************* * traverse through the groupshareusermap.csv * and compare substr1 from the Group.csv * to substr2 from the groupshareusermap.csv *******************************************/ if(!(GRPSHR = fopen(GROUPSHAREFILE,"r"))){ printf("cant open %s to read\n",GROUPSHAREFILE); fclose(GRP); fclose(NEWGRPSHR); exit(1); } /* skip first line (header) */ fgets(lnstr, MAX, GRPSHR); while(fgets(lnstr, MAX, GRPSHR)){ strcpy(tmpstr,lnstr); tokenptr2 = strtok(tmpstr,seperator); sprintf(substr2,"%s",tokenptr2); if(strcmp(substr2, substr1) == 0 ){ fprintf(NEWGRPSHR, "%s", lnstr); fflush(NEWGRPSHR); } } /* reset everything */ fclose(GRPSHR); substr1[0]=NULL; substr2[0]=NULL; } /* clean up and exit */ close(GRP); close(NEWGRPSHR); exit(0); }