source: zwrite.c @ a3ba748

barnowl_perlaimdebianowlrelease-1.4release-1.5release-1.6release-1.7release-1.8release-1.9
Last change on this file since a3ba748 was c01e477, checked in by James M. Kretchmar <kretch@mit.edu>, 19 years ago
Fixed bug in sending messages to a class with the new zsig code. Started modifying 'tty' variable. Warning: NOT DONE.
  • Property mode set to 100644
File size: 6.2 KB
Line 
1#include <string.h>
2#include <pwd.h>
3#include <sys/types.h>
4#include <unistd.h>
5#include "owl.h"
6
7static const char fileIdent[] = "$Id$";
8
9int owl_zwrite_create_and_send_from_line(char *cmd, char *msg) {
10  owl_zwrite z;
11  int rv;
12  rv = owl_zwrite_create_from_line(&z, cmd);
13  if (rv) return(rv);
14  owl_zwrite_send_message(&z, msg);
15  owl_zwrite_free(&z);
16  return(0);
17}
18
19int owl_zwrite_create_from_line(owl_zwrite *z, char *line) {
20  int argc, badargs, myargc;
21  char **argv, **myargv;
22  char *zsigexec, *zsigowlvar, *zsigzvar, *ptr;
23  struct passwd *pw;
24
25  badargs=0;
26 
27  /* set the defaults */
28  strcpy(z->realm, "");
29  strcpy(z->class, "message");
30  strcpy(z->inst, "personal");
31  strcpy(z->opcode, "");
32  z->zsig=owl_strdup("");
33  z->cc=0;
34  z->noping=0;
35  owl_list_create(&(z->recips));
36
37  /* parse the command line for options */
38  argv=myargv=owl_parseline(line, &argc);
39  if (argc<0) {
40    owl_function_makemsg("Unbalanced quotes");
41    return(-1);
42  }
43  myargc=argc;
44  if (myargc && *(myargv[0])!='-') {
45    myargc--;
46    myargv++;
47  }
48  while (myargc) {
49    if (!strcmp(myargv[0], "-c")) {
50      if (myargc<2) {
51        badargs=1;
52        break;
53      }
54      strcpy(z->class, myargv[1]);
55      myargv+=2;
56      myargc-=2;
57    } else if (!strcmp(myargv[0], "-i")) {
58      if (myargc<2) {
59        badargs=1;
60        break;
61      }
62      strcpy(z->inst, myargv[1]);
63      myargv+=2;
64      myargc-=2;
65    } else if (!strcmp(myargv[0], "-r")) {
66      if (myargc<2) {
67        badargs=1;
68        break;
69      }
70      strcpy(z->realm, myargv[1]);
71      myargv+=2;
72      myargc-=2;
73    } else if (!strcmp(myargv[0], "-O")) {
74      if (myargc<2) {
75        badargs=1;
76        break;
77      }
78      strcpy(z->opcode, myargv[1]);
79      myargv+=2;
80      myargc-=2;
81    } else if (!strcmp(myargv[0], "-C")) {
82      z->cc=1;
83      myargv++;
84      myargc--;
85    } else if (!strcmp(myargv[0], "-n")) {
86      z->noping=1;
87      myargv++;
88      myargc--;
89    } else {
90      /* anything unattached is a recipient */
91      owl_list_append_element(&(z->recips), strdup(myargv[0]));
92      myargv++;
93      myargc--;
94    }
95  }
96
97  owl_parsefree(argv, argc);
98
99  if (badargs) {
100    return(-1);
101  }
102
103  if (!strcasecmp(z->class, "message") &&
104      !strcasecmp(z->inst, "personal") &&
105      owl_list_get_size(&(z->recips))==0) {
106    /* do the makemsg somewhere else */
107    owl_function_makemsg("You must specify a recipient");
108    return(-1);
109  }
110
111  /* set a zsig */
112  zsigexec = owl_global_get_zsig_exec(&g);
113  zsigowlvar = owl_global_get_zsig(&g);
114  zsigzvar = ZGetVariable("zwrite-signature");
115
116  if (zsigowlvar && *zsigowlvar) {
117    owl_free(z->zsig);
118    z->zsig=strdup(zsigowlvar);
119  } else if (zsigexec && *zsigexec) {
120    FILE *file;
121    char buff[LINE];
122
123    file=popen(zsigexec, "r");
124    if (!file) {
125      if (zsigzvar && *zsigzvar) {
126        owl_free(z->zsig);
127        z->zsig=owl_strdup(zsigzvar);
128      }
129    } else {
130      owl_free(z->zsig);
131      z->zsig=owl_malloc(LINE);
132      strcpy(z->zsig, "");
133      while (fgets(buff, LINE, file)) { /* wrong sizing */
134        strcat(z->zsig, buff);
135      }
136      pclose(file);
137      if (z->zsig[strlen(z->zsig)-1]=='\n') {
138        z->zsig[strlen(z->zsig)-1]='\0';
139      }
140    }
141  } else if (zsigzvar) {
142    owl_free(z->zsig);
143    z->zsig=owl_strdup(zsigzvar);
144  } else if (((pw=getpwuid(getuid()))!=NULL) && (pw->pw_gecos)) {
145    owl_free(z->zsig);
146    z->zsig=strdup(pw->pw_gecos);
147    ptr=strchr(z->zsig, ',');
148    if (ptr) {
149      ptr[0]='\0';
150    }
151  }
152
153  return(0);
154}
155
156void owl_zwrite_send_ping(owl_zwrite *z) {
157  int i, j;
158  char to[LINE];
159
160  if (z->noping) return;
161 
162  if (strcasecmp(z->class, "message") ||
163      strcasecmp(z->inst, "personal")) {
164    return;
165  }
166
167  /* if there are no recipients we won't send a ping, which
168     is what we want */
169  j=owl_list_get_size(&(z->recips));
170  for (i=0; i<j; i++) {
171    if (strcmp(z->realm, "")) {
172      sprintf(to, "%s@%s", (char *) owl_list_get_element(&(z->recips), i), z->realm);
173    } else {
174      strcpy(to, owl_list_get_element(&(z->recips), i));
175    }
176    send_ping(to);
177  }
178
179}
180
181void owl_zwrite_send_message(owl_zwrite *z, char *msg) {
182  int i, j;
183  char to[LINE];
184
185  j=owl_list_get_size(&(z->recips));
186  if (j>0) {
187    char *tmpmsg=NULL;
188    char toline[LINE];
189
190    if (z->cc) {
191      strcpy(toline, "CC: ");
192      for (i=0; i<j; i++) {
193        if (strcmp(z->realm, "")) {
194          sprintf(toline, "%s%s@%s ", toline, (char *) owl_list_get_element(&(z->recips), i), z->realm);
195        } else {
196          sprintf(toline, "%s%s ", toline, (char *) owl_list_get_element(&(z->recips), i));
197        }
198      }
199      tmpmsg=owl_malloc(strlen(msg)+strlen(toline)+30);
200      sprintf(tmpmsg, "%s\n%s", toline, msg);
201    }
202
203    for (i=0; i<j; i++) {
204      if (strcmp(z->realm, "")) {
205        sprintf(to, "%s@%s", (char *) owl_list_get_element(&(z->recips), i), z->realm);
206      } else {
207        strcpy(to, owl_list_get_element(&(z->recips), i));
208      }
209      if (z->cc) {
210        send_zephyr(z->opcode, z->zsig, z->class, z->inst, to, tmpmsg);
211      } else {
212        send_zephyr(z->opcode, z->zsig, z->class, z->inst, to, msg);
213      }
214    }
215    if (z->cc) {
216      owl_free(tmpmsg);
217    }
218  } else {
219    sprintf(to, "@%s", z->realm);
220    send_zephyr(z->opcode, z->zsig, z->class, z->inst, to, msg);
221  }
222}
223
224char *owl_zwrite_get_class(owl_zwrite *z) {
225  return(z->class);
226}
227
228char *owl_zwrite_get_instance(owl_zwrite *z) {
229  return(z->inst);
230}
231
232char *owl_zwrite_get_opcode(owl_zwrite *z) {
233  return(z->opcode);
234}
235
236char *owl_zwrite_get_realm(owl_zwrite *z) {
237  return(z->realm);
238}
239
240char *owl_zwrite_get_zsig(owl_zwrite *z) {
241  return(z->zsig);
242}
243
244void owl_zwrite_get_recipstr(owl_zwrite *z, char *buff) {
245  int i, j;
246
247  strcpy(buff, "");
248  j=owl_list_get_size(&(z->recips));
249  for (i=0; i<j; i++) {
250    strcat(buff, owl_list_get_element(&(z->recips), i));
251    strcat(buff, " ");
252  }
253  buff[strlen(buff)-1]='\0';
254}
255
256int owl_zwrite_get_numrecips(owl_zwrite *z) {
257  return(owl_list_get_size(&(z->recips)));
258}
259
260char *owl_zwrite_get_recip_n(owl_zwrite *z, int n) {
261  return(owl_list_get_element(&(z->recips), n));
262}
263
264int owl_zwrite_is_personal(owl_zwrite *z) {
265  /* return true if at least one of the recipients is personal */
266  int i, j;
267  char *foo;
268
269  j=owl_list_get_size(&(z->recips));
270  for (i=0; i<j; i++) {
271    foo=owl_list_get_element(&(z->recips), i);
272    if (foo[0]!='@') return(1);
273  }
274  return(0);
275}
276 
277void owl_zwrite_free(owl_zwrite *z) {
278  owl_list_free_all(&(z->recips), &owl_free);
279  owl_free(z->zsig);
280}
Note: See TracBrowser for help on using the repository browser.