source: zwrite.c @ e3869df

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