root/branches/licq/website/licq.icq-clb.c

Revision 4129, 6.9 kB (checked in by anonymous, 4 years ago)

This commit was manufactured by cvs2svn to create branch 'licq'.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1/*
2 * icq .clb to licq contact list converter
3 * written by Philip Nelson (phatfil@optushome.com.au)
4 * uin: 16385042
5 *
6 * Minor fix by Jon Keating
7 */
8
9#include <stdio.h>
10#define MAXLINE 128
11
12typedef struct icqInfo
13{
14    char uin[15];
15    char name[20];
16    char group[20];
17    struct icqInfo *link;
18} icqInfo;
19
20icqInfo * Add(icqInfo *, char *, char *, char *);
21
22typedef struct groups
23{
24    char grpname[20];
25    int groupid;
26    struct groups *link;
27} groups;
28
29void printInfo(icqInfo *, groups *);
30groups * addGroup(groups *, char *);
31void printGroups(groups *);
32int foundGroup(groups *, char *);
33groups * doGroups(icqInfo *, groups *);
34int getGroupId(char *, groups *);
35char basedir[1000];
36char clb[100];
37
38int main(int numargs, char *argv[]) {
39    int i;
40    int j;
41    FILE *f;
42    char line[MAXLINE];
43    char *name;
44    char *group;
45    char *uin;
46    char accept;
47    icqInfo *details_pointer = NULL;
48    groups *groups_pointer = NULL;
49
50    if(numargs != 3) {
51        printf("Usage: %s <icqclbfile> <licqbasedir>\n", argv[0]);
52        exit(1);
53    }
54
55    printf("**WARNING!!** It is HIGHLY recommended you backup your\nlicq base directory (default ~/.licq) before using this\ntool. If you haven't done so, please do, then rerun me.\nContinue? (y/n) ");
56    accept = getchar();
57    accept = toupper(accept);
58    if(accept != 'Y') {
59        printf("Exiting...\n");
60        exit(0);
61    }
62   
63    strncpy(clb, argv[1], 100);
64    clb[99] = '\0';
65    strncpy(basedir, argv[2], 1000);
66    basedir[999] = '\0';
67
68    f = fopen(clb, "r");
69    if(f) {
70        int k;
71        for(k=1;fgets(line, MAXLINE, f);k++) {
72            j=0;
73
74            for(i=0;line[i] != '\r';i++) {
75                if(line[i] == ';') {
76                    *(line+i) = '\0';
77                    if(j==0) {
78                        group = line;
79                        uin = line+i+1;
80                    }else if(j==1) {
81                        name = line+i+1;
82                    }else if(j==2) {
83                    } else {
84                        printf("Error parsing file! line: %d (make sure name doesn't contains any semilcolons)\n", k);
85                        exit(1);
86                    }
87                    j++;
88                }
89            }
90           
91            details_pointer = Add(details_pointer, name, group, uin);
92        }
93    }else{
94        printf("Couldn't open %s\n", argv[1]);
95    }
96   
97    groups_pointer = doGroups(details_pointer, groups_pointer);
98    printInfo(details_pointer, groups_pointer);
99    printGroups(groups_pointer);
100    printf("Done! Please icq 16385042 and tell him how useful this was :-)\n");
101}
102
103icqInfo * Add(icqInfo * details_pointer, char *name, char *group, char *uin)
104{
105    icqInfo * lp = details_pointer;
106        if(details_pointer) {
107        while(details_pointer->link)
108            details_pointer=details_pointer->link;
109       
110        details_pointer->link = (struct icqInfo *)malloc(sizeof(icqInfo));
111        details_pointer = details_pointer->link;
112        details_pointer->link = NULL;
113        strncpy(details_pointer->name, name, 20);
114        strncpy(details_pointer->group, group, 20);
115        strncpy(details_pointer->uin, uin, 15);
116        details_pointer->name[19] = '\0';
117        details_pointer->group[19] = '\0';
118        details_pointer->uin[14] = '\0';
119        return lp;
120    } else {
121        details_pointer = (struct icqInfo *)malloc(sizeof(icqInfo));
122        details_pointer->link = NULL;
123        strncpy(details_pointer->name, name, 20);
124        strncpy(details_pointer->group, group, 20);
125        strncpy(details_pointer->uin, uin, 20);
126        details_pointer->name[19] = '\0';
127        details_pointer->group[19] = '\0';
128        details_pointer->uin[14] = '\0';
129        return details_pointer;
130    }
131}
132
133void printInfo(icqInfo *details_pointer, groups *groups_pointer)
134{
135    FILE *users;
136    FILE *user;
137    int i;
138    int groupid;
139    char usersfile[1011];
140    strcpy(usersfile, basedir);
141    strcat(usersfile, "/users.conf");
142    users=fopen(usersfile, "w");
143    if(users==NULL) {
144        printf("Error: couldn't open %s for writing\n", usersfile);
145        exit(1);
146    }
147    fputs("[users]\n", users);
148    for(i=1;details_pointer;i++) {
149        char uinfile[1000];
150        fprintf(users, "User%d = %s\n", i, details_pointer->uin);
151        sprintf(uinfile, "%s/users/%s.uin", basedir, details_pointer->uin);
152        user=fopen(uinfile, "w");
153        fputs("[user]\n", user);
154        fprintf(user, "Alias = %s\n", details_pointer->name);
155        groupid = getGroupId(details_pointer->group, groups_pointer);
156        if(groupid) {
157            fprintf(user, "Groups.User = %d\n", groupid);
158        }
159        details_pointer = details_pointer->link;
160    }
161    fprintf(users, "NumOfUsers = %d", i-1);
162    fclose(users);
163    fclose(user);
164}
165
166int getGroupId(char *group, groups *groups_pointer)
167{
168    if(groups_pointer == NULL) {
169        printf("weird error!\n");
170    } else {
171        while(groups_pointer) {
172            if(!strcmp(group, groups_pointer->grpname)) {
173                return groups_pointer->groupid;
174            }
175            groups_pointer = groups_pointer->link;
176        }
177    }
178    return 0;
179}
180
181groups *doGroups(icqInfo *details_pointer, groups *groups_pointer)
182{
183    if(details_pointer == NULL) {
184        printf("weird error!\n");
185    } else {
186        while(details_pointer) {
187            if(!foundGroup(groups_pointer, details_pointer->group)) {
188                groups_pointer = addGroup(groups_pointer, details_pointer->group);
189            }
190            details_pointer=details_pointer->link;
191        }
192    }
193    return groups_pointer;
194}
195
196int foundGroup(groups *groups_pointer, char *groupname)
197{
198    int found = 1;
199    if(groups_pointer == NULL) {
200        found = 1;
201    } else {
202        while(groups_pointer) {
203            if(!strcmp(groups_pointer->grpname, groupname)) {
204                found = 0;
205            }
206            groups_pointer = groups_pointer->link;
207        }
208    }
209    if(found) {
210        return 0;
211    }else{
212        return 1;
213    }
214}
215           
216void printGroups(groups *groups_pointer)
217{
218    int i;
219
220    FILE *conf;
221    FILE *tmp;
222    char line[100];
223    char brokenline[100];
224    char *borked=NULL;
225    char conffile[1000];
226    char tmpfile[1000];
227    char mvcmd[1000];
228    strcpy(conffile, basedir);
229    strcat(conffile, "/licq.conf");
230    strcpy(tmpfile, basedir);
231    strcat(tmpfile, "/licq.conf.tmp");
232    conf=fopen(conffile, "r");
233    if(conf==NULL) {
234        printf("Error: couldn't open %s for reading!\n", conffile);
235        exit(1);
236    }
237    tmp=fopen(tmpfile, "w");
238    if(tmp==NULL) {
239        printf("Error: couldn't write to temporary file %s (check dir permissions)\n", tmpfile);
240        exit(1);
241    }
242
243    while(fgets(line, 100, conf)) {
244        if(!strncmp(line, "[groups]", 8)) {
245            while(fgets(line, 100, conf)) {
246                if(!strncmp(line, "[", 1)) {
247                    break;
248                }
249            }
250        }
251        fprintf(tmp, "%s", line);
252    }
253    fclose(conf);
254    fputs("[groups]\n", tmp);
255    for(i=0;groups_pointer;i++) {
256        fprintf(tmp, "Group%d.name = %s\n", i+1, groups_pointer->grpname);
257        groups_pointer = groups_pointer->link;
258    }
259    fprintf(tmp, "NumOfGroups = %d\n", i);
260    fputs("DefaultGroup = 0\n",tmp);
261    fputs("NewUserGroup = 1\n",tmp);
262    fclose(tmp);
263    rename(tmpfile, conffile);
264}
265
266groups *addGroup(groups *groups_pointer, char *name)
267{
268    int i=1;
269    groups *lp = groups_pointer;
270    if(groups_pointer) {
271        i=2;
272        while(groups_pointer->link) {
273            groups_pointer = groups_pointer->link;
274            i++;
275        }   
276        groups_pointer->link = (struct groups *)malloc(sizeof(groups));
277        groups_pointer = groups_pointer->link;
278        groups_pointer->link = NULL;
279        strcpy(groups_pointer->grpname, name);
280        groups_pointer->groupid = power(2, i-1);
281        return lp;
282    } else {
283        groups_pointer = (struct groups *)malloc(sizeof(groups));
284        groups_pointer->link = NULL;
285        strcpy(groups_pointer->grpname, name);
286        groups_pointer->groupid = power(2, i-1);
287        i++;
288        return groups_pointer;
289    }
290}
291
292int power(int base, int n) {
293    int     i,
294            p;
295    p = 1;
296    for (i = 1; i <= n; ++i)
297    p *= base;
298    return p;
299}
300
301
302
303
304
305
306
Note: See TracBrowser for help on using the browser.