aboutsummaryrefslogtreecommitdiff
path: root/misc/libmcal/files
diff options
context:
space:
mode:
authorYing-Chieh Liao <ijliao@FreeBSD.org>2001-12-12 20:16:22 +0000
committerYing-Chieh Liao <ijliao@FreeBSD.org>2001-12-12 20:16:22 +0000
commit743a256850e12f012a76b99359e6c03d1d3885e4 (patch)
treebf506df04b90128ea1ec03cd1e7b170d77b7d54f /misc/libmcal/files
parenta86a05bdbc1443212e3f3287625e583a8bd4ae00 (diff)
downloadports-743a256850e12f012a76b99359e6c03d1d3885e4.tar.gz
ports-743a256850e12f012a76b99359e6c03d1d3885e4.zip
Notes
Diffstat (limited to 'misc/libmcal/files')
-rw-r--r--misc/libmcal/files/patch-ad17
-rw-r--r--misc/libmcal/files/patch-ae73
-rw-r--r--misc/libmcal/files/patch-af65
-rw-r--r--misc/libmcal/files/patch-ag120
-rw-r--r--misc/libmcal/files/patch-ah25
-rw-r--r--misc/libmcal/files/patch-ai88
-rw-r--r--misc/libmcal/files/patch-aj184
-rw-r--r--misc/libmcal/files/patch-ak106
-rw-r--r--misc/libmcal/files/patch-al479
9 files changed, 1157 insertions, 0 deletions
diff --git a/misc/libmcal/files/patch-ad b/misc/libmcal/files/patch-ad
new file mode 100644
index 000000000000..5ece66b2d1e6
--- /dev/null
+++ b/misc/libmcal/files/patch-ad
@@ -0,0 +1,17 @@
+--- bool.h.orig Thu Dec 2 09:01:39 1999
++++ bool.h Wed Jun 28 00:17:14 2000
+@@ -1,4 +1,4 @@
+-/* $Id: bool.h,v 1.1.1.1 1999/12/02 08:01:39 zircote Exp $
++/* $Id: bool.h,v 1.2 2000/06/27 22:17:14 askalski Exp $
+ *
+ * Libmcal - Modular Calendar Access Library
+ * Copyright (C) 1999 Mark Musone and Andrew Skalski
+@@ -32,7 +32,7 @@
+ #ifndef _BOOL_H
+ #define _BOOL_H
+
+-#ifndef __cplusplus__
++#ifndef __cplusplus
+ typedef enum { false, true } bool;
+ #endif
+
diff --git a/misc/libmcal/files/patch-ae b/misc/libmcal/files/patch-ae
new file mode 100644
index 000000000000..c9b5de5b647e
--- /dev/null
+++ b/misc/libmcal/files/patch-ae
@@ -0,0 +1,73 @@
+--- datetime.c.orig Sat Mar 11 03:14:42 2000
++++ datetime.c Thu May 11 21:43:23 2000
+@@ -1,5 +1,5 @@
+ /*
+- * $Id: datetime.c,v 1.2 2000/03/11 02:14:42 chuck Exp $
++ * $Id: datetime.c,v 1.3 2000/05/11 19:43:23 inan Exp $
+ * Libmcal - Modular Calendar Access Library
+ * Copyright (C) 1999 Mark Musone and Andrew Skalski
+ *
+@@ -280,8 +280,37 @@
+ {
+ return dt_dayofepoch(dt) % 7;
+ }
+-
+-
++/*
++char*
++dt_dayofweekstr(const datetime_t *dt)
++{
++ char output[3];
++ switch (dt_dayofepoch(dt) % 7) {
++ case 0:
++ strcpy (output, "SU");
++ break;
++ case 1:
++ strcpy (output, "MO");
++ break;
++ case 2:
++ strcpy (output, "TU");
++ break;
++ case 3:
++ strcpy (output, "WE");
++ break;
++ case 4:
++ strcpy (output, "TH");
++ break;
++ case 5:
++ strcpy (output, "FR");
++ break;
++ case 6:
++ strcpy (output, "SA");
++ break;
++ }
++ return output;
++}
++*/
+ int
+ dt_dayofepoch(const datetime_t *dt)
+ {
+@@ -460,3 +489,23 @@
+ }
+ return w;
+ }
++
++int
++dt_orderofmonth( const datetime_t *dt, const direction_t direction)
++{
++ datetime_t temp_dt = DT_INIT;
++ int temp_int;
++
++ switch (direction) {
++ case DT_FORWARD:
++ dt_setnthwday(&temp_dt, dt->year, dt->mon, 1, dt_dayofweek(dt) );
++ temp_int = (dt->mday - temp_dt.mday)/7;
++ temp_int ++; //start count at 1, not zero
++ break;
++ case DT_BACKWARD:
++ // not built
++ return false;
++ }
++ return temp_int;
++}
++
diff --git a/misc/libmcal/files/patch-af b/misc/libmcal/files/patch-af
new file mode 100644
index 000000000000..6fab309d4a87
--- /dev/null
+++ b/misc/libmcal/files/patch-af
@@ -0,0 +1,65 @@
+--- datetime.h.orig Sat Mar 11 03:14:43 2000
++++ datetime.h Fri Mar 16 20:27:14 2001
+@@ -1,5 +1,5 @@
+ /*
+- * $Id: datetime.h,v 1.2 2000/03/11 02:14:43 chuck Exp $
++ * $Id: datetime.h,v 1.4 2001/03/16 19:27:14 chuck Exp $
+ * Libmcal - Modular Calendar Access Library
+ * Copyright (C) 1999 Mark Musone and Andrew Skalski
+ *
+@@ -26,7 +26,7 @@
+ * Andrew Skalski
+ * askalski@chek.com
+ *
+- * mcal@lists.chek.com
++ * libmcal-users@lists.sourceforge.net
+ */
+
+ #ifndef _DATETIME_H
+@@ -66,6 +66,11 @@
+ DECEMBER
+ } month_t;
+
++typedef enum {
++ DT_FORWARD,
++ DT_BACKWARD
++} direction_t;
++
+ /**
+ * struct datetime
+ *
+@@ -178,11 +183,34 @@
+ /* Returns the week number for d=day, m=month, y=year */
+ int dt_weekofyear(int d, int m, int y);
+
++/* Returns the week number in the given month counting in the given direction */
++int dt_orderofmonth( const datetime_t *dt, const direction_t direction);
++
+ /* convenience macros to get the first/last days of a week */
+ #define dt_startofweek(dt, ref, weekstart) \
+ dt_setweekof((dt), (ref), (weekstart), (weekstart))
+ #define dt_endofweek(dt, ref, weekstart) \
+ dt_setweekof((dt), (ref), (weekstart), (7+(weekstart)-1)%7)
++#define dt_dayofweekstr(dayno) \
++ (dayno) >= 4 ? \
++ (dayno) = 6 ? \
++ "SA" : \
++ (dayno) = 5 ? \
++ "FR" : \
++ "TH" \
++ ; \
++ ;: \
++ (dayno) >= 2 ? \
++ (dayno) = 3 ? \
++ "WE" : \
++ "TU" \
++ ;: \
++ (dayno) = 1 ? \
++ "MO" : \
++ "SU" \
++ ; \
++ ; \
++
+
+ /**********************************/
+
diff --git a/misc/libmcal/files/patch-ag b/misc/libmcal/files/patch-ag
new file mode 100644
index 000000000000..e3217bded96c
--- /dev/null
+++ b/misc/libmcal/files/patch-ag
@@ -0,0 +1,120 @@
+--- icalroutines.c.orig Tue Jan 25 04:08:10 2000
++++ icalroutines.c Thu May 11 21:43:23 2000
+@@ -1,5 +1,5 @@
+ /*
+- * #$Id: icalroutines.c,v 1.1 2000/01/25 03:08:10 markie Exp $
++ * #$Id: icalroutines.c,v 1.2 2000/05/11 19:43:23 inan Exp $
+ *
+ * Libmcal - Modular Calendar Access Library
+ * Copyright (C) 1999 Mark Musone and Andrew Skalski
+@@ -594,3 +594,110 @@
+ putc(pad, out);
+ }
+ }
++
++#define MAX(a,b) (a)>(b) ? (a) :(b)
++void
++ical_set_byday ( char *output, const byday_t *input ) {
++ int i;
++ char temp_string[50];
++
++ strcpy (output, "");
++
++ for (i=0; i<=6; i++) {
++ /* wdays is a bit field corresponding to days of the week */
++ if ((input->weekdays) & (0x1 <<i) ) {
++ if (input->ordwk[i] != 0) {
++ sprintf( temp_string, "%d", input->ordwk[i] );
++ strcat ( output, temp_string );
++ }
++ switch (i) {
++ case 0:
++ strcat ( output, "SU, ");
++ break;
++ case 1:
++ strcat ( output, "MO, ");
++ break;
++ case 2:
++ strcat ( output, "TU, ");
++ break;
++ case 3:
++ strcat ( output, "WE, ");
++ break;
++ case 4:
++ strcat ( output, "TH, ");
++ break;
++ case 5:
++ strcat ( output, "FR, ");
++ break;
++ case 6:
++ strcat ( output, "SA, ");
++ break;
++ }
++ }
++ }
++ output[MAX(strlen(output)-2,0)] = '\0';
++
++}
++#undef MAX
++
++void
++ical_get_byday ( byday_t *output, const char *input ) {
++ char *temp_string;
++ char *token;
++ char *day_start;
++ int interval;
++ int day_index;
++ temp_string = strdup(input);
++
++ token = strtok (temp_string, ",");
++ while ( token != NULL ) {
++ day_start = token + strlen(token) - 2;
++ if (strcasecmp (day_start, "SU")==0) {
++ output->weekdays |= M_SUNDAY;
++ day_index = 0;
++ } else if (strcasecmp (day_start, "MO")==0) {
++ output->weekdays |= M_MONDAY;
++ day_index = 1;
++ } else if (strcasecmp (day_start, "TU")==0) {
++ output->weekdays |= M_TUESDAY;
++ day_index = 2;
++ } else if (strcasecmp (day_start, "WE")==0) {
++ output->weekdays |= M_WEDNESDAY;
++ day_index = 3;
++ } else if (strcasecmp (day_start, "TH")==0) {
++ output->weekdays |= M_THURSDAY;
++ day_index = 4;
++ } else if (strcasecmp (day_start, "FR")==0) {
++ output->weekdays |= M_FRIDAY;
++ day_index = 5;
++ } else if (strcasecmp (day_start, "SA")==0) {
++ output->weekdays |= M_SATURDAY;
++ day_index = 6;
++ }
++ *day_start = '\0';
++ interval = atoi (token);
++ output->ordwk[day_index] = interval;
++ }
++
++ free( token );
++ free( temp_string );
++}
++
++void
++ical_get_recur_freq( recur_t *output, const char *input, const char *byday) {
++ if (strncmp (input, "D",1)==0) {
++ *output = RECUR_DAILY;
++ } else if (strncmp (input, "W",1)==0) {
++ *output = RECUR_WEEKLY;
++ } else if (strncmp (input, "M",1)==0) {
++ if (strlen(byday) == 0) {
++ *output = RECUR_MONTHLY_MDAY;
++ } else {
++ *output = RECUR_MONTHLY_WDAY;
++ }
++ } else if (strncmp (input, "Y",1)==0) {
++ *output = RECUR_YEARLY;
++ } else {
++ *output = RECUR_NONE;
++ }
++}
diff --git a/misc/libmcal/files/patch-ah b/misc/libmcal/files/patch-ah
new file mode 100644
index 000000000000..ef9e8eb686c9
--- /dev/null
+++ b/misc/libmcal/files/patch-ah
@@ -0,0 +1,25 @@
+--- icalroutines.h.orig Tue Jan 25 04:08:10 2000
++++ icalroutines.h Thu May 11 21:43:23 2000
+@@ -1,5 +1,5 @@
+ /*
+- * #$Id: icalroutines.h,v 1.1 2000/01/25 03:08:10 markie Exp $
++ * #$Id: icalroutines.h,v 1.2 2000/05/11 19:43:23 inan Exp $
+ *
+ * Libmcal - Modular Calendar Access Library
+ * Copyright (C) 1999 Mark Musone and Andrew Skalski
+@@ -70,5 +70,15 @@
+ const unsigned char *buf,
+ size_t size);
+
++/* ICAL formatting. */
++#define BYDAY_INIT {0, {0,0,0,0,0,0,0}}
++typedef struct {
++ unsigned int weekdays;
++ int ordwk[7];
++} byday_t;
++
++void ical_set_byday(char *output, const byday_t *input);
++void ical_get_byday(byday_t *output, const char *input);
++void ical_get_recur_freq( recur_t *output, const char *input, const char *byday);
+
+ #endif
diff --git a/misc/libmcal/files/patch-ai b/misc/libmcal/files/patch-ai
new file mode 100644
index 000000000000..c1d91d33bdcb
--- /dev/null
+++ b/misc/libmcal/files/patch-ai
@@ -0,0 +1,88 @@
+--- icap/icap.c.orig Mon Mar 27 06:12:33 2000
++++ icap/icap.c Fri Jul 7 17:16:18 2000
+@@ -2,7 +2,7 @@
+ * Libmcal - Modular Calendar Access Library
+ * Copyright (C) 1999 Mark Musone and Andrew Skalski
+ *
+- * #$Id: icap.c,v 1.1.1.1 1999/12/02 08:02:27 zircote Exp $
++ * #$Id: icap.c,v 1.4 2000/07/07 15:16:18 markie Exp $
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+@@ -36,7 +36,7 @@
+ #include "icaproutines.h"
+
+
+-#define ICAP_VAR "0.3"
++#define ICAP_VAR "0.2"
+ /** ICAP Driver **/
+ #define DATA_T struct icap_data
+ #define DATA ((DATA_T*) stream->data)
+@@ -49,6 +49,7 @@
+ const CALADDR *addr, long options);
+ static CALSTREAM* icap_close(CALSTREAM *stream, long options);
+ static bool icap_ping(CALSTREAM *stream);
++static bool icap_create(CALSTREAM *stream, const char *calendar);
+ static bool icap_search_range( CALSTREAM *stream,
+ const datetime_t *start,
+ const datetime_t *end);
+@@ -72,6 +73,7 @@
+ icap_open,
+ icap_close,
+ icap_ping,
++ icap_create,
+ icap_search_range,
+ icap_search_alarm,
+ icap_fetch,
+@@ -243,6 +245,13 @@
+
+
+ bool
++icap_create(CALSTREAM *stream, const char *calendar)
++{
++ return false;
++}
++
++
++bool
+ icap_search_range( CALSTREAM *stream,
+ const datetime_t *start,
+ const datetime_t *end)
+@@ -258,12 +267,12 @@
+
+ endq = query;
+ if (start && dt_hasdate(start)) {
+- endq += sprintf(endq, " ICAL DTSTART>=%04u%02u%02u",
+- start->year, start->mon, start->mday);
++ endq += sprintf(endq, " ICAL DTSTART > %04u%02u%02u",
++ start->year, start->mon, start->mday-1);
+ }
+ if (end && dt_hasdate(end)) {
+- endq += sprintf(endq, " ICAL DTSTART<=%04u%02u%02u",
+- end->year, end->mon, end->mday);
++ endq += sprintf(endq, " ICAL DTSTART < %04u%02u%02u",
++ end->year, end->mon, end->mday+1);
+ }
+ if (endq == query)
+ strcpy(query, " ALL");
+@@ -288,7 +297,7 @@
+ if (dt_empty(when))
+ return false;
+
+- sprintf(query, "UID SEARCH ALARMING %04u%02u%02uT%02u%02u%02uZ",
++ sprintf(query, "UID SEARCH COMPONENT VALARM ICAL DTSTART = %04u%02u%02uT%02u%02u%02uZ",
+ when->year, when->mon, when->mday,
+ when->hour, when->min, when->sec);
+
+@@ -373,9 +382,9 @@
+ {
+ char query[1024];
+
+- if (!icap_begin(DATA->net, "UID REMOVE "))
++ if (!icap_begin(DATA->net, "UID STORE "))
+ return false;
+- sprintf(query, "%lu", id);
++ sprintf(query, "%lu +FLAGS \\Deleted", id);
+ if (!icap_opaque(DATA->net, query))
+ return false;
+ if (icap_end(DATA->net) != ICAP_OK)
diff --git a/misc/libmcal/files/patch-aj b/misc/libmcal/files/patch-aj
new file mode 100644
index 000000000000..6831a5b26f88
--- /dev/null
+++ b/misc/libmcal/files/patch-aj
@@ -0,0 +1,184 @@
+--- mcal.c.orig Sun Feb 27 06:01:54 2000
++++ mcal.c Tue Jan 9 04:26:48 2001
+@@ -1,5 +1,5 @@
+ /*
+- * $Id: mcal.c,v 1.6 2000/02/27 05:01:54 inan Exp $
++ * $Id: mcal.c,v 1.9 2001/01/09 03:26:48 markie Exp $
+ * Libmcal - Modular Calendar Access Library
+ * Copyright (C) 1999 Mark Musone and Andrew Skalski
+ *
+@@ -174,7 +174,7 @@
+ /* size-count and sanity-check all fields */
+ if (addr->host) {
+ /* sanity: host contains neither '/' nor '}' */
+- if (strchr(addr->host, '}') || strchr(addr->host, '/'))
++ if (strpbrk(addr->host, "}/"))
+ return NULL;
+ size += strlen(addr->host) + 2;
+
+@@ -318,10 +318,33 @@
+ }
+
+
++bool
++calevent_valid(const CALEVENT *event)
++{
++ int n = 0;
++
++ /* both must have date field set */
++ if (!dt_hasdate(&event->start) || !dt_hasdate(&event->end))
++ return false;
++
++ /* either none or both may have time field set */
++ if (dt_hastime(&event->start)) n++;
++ if (dt_hastime(&event->end)) n++;
++ if (n == 1)
++ return false;
++
++ /* start must precede end */
++ if (dt_compare(&event->start, &event->end) > 0)
++ return false;
++
++ return true;
++}
++
++
+ const char*
+-calevent_getattr(CALEVENT *event, const char *name)
++calevent_getattr(const CALEVENT *event, const char *name)
+ {
+- CALATTR *attr;
++ const CALATTR *attr;
+
+ for (attr = event->attrlist; attr; attr = attr->next)
+ if (!strcasecmp(attr->name, name))
+@@ -694,7 +717,7 @@
+ int wday;
+
+
+- nth = estart.mday / 7 + 1;
++ nth = (estart.mday - 1) / 7 + 1;
+ wday = dt_dayofweek(&estart);
+
+ /* adjust estart to be the first candidate */
+@@ -750,6 +773,18 @@
+ return false;
+ }
+
++bool
++cal_create(CALSTREAM *stream,const char *calendar) {
++ bool output;
++
++ if (stream == NULL) {
++ output = false;
++ } else {
++ output = stream->driver->create(stream, calendar);
++ }
++
++ return output;
++}
+
+ bool
+ cal_valid(const char *address)
+@@ -880,6 +915,8 @@
+ {
+ if (stream == NULL || stream->dead)
+ return false;
++ if (!calevent_valid(event))
++ return false;
+ return stream->driver->append(stream, addr, id, event);
+ }
+
+@@ -944,12 +981,31 @@
+ return good;
+ }
+
++
++bool
++cal_delete(CALSTREAM *stream, char *calendar)
++{
++ if (stream == NULL || stream->dead)
++ return false;
++ return stream->driver->delete(stream, calendar);
++}
++
++bool
++cal_rename(CALSTREAM *stream, char *src,char *dest)
++{
++ if (stream == NULL || stream->dead)
++ return false;
++ return stream->driver->rename(stream, src,dest);
++}
++
++
+ /** Dummy Driver **/
+ static bool dummy_valid(const CALADDR *addr);
+ static CALSTREAM* dummy_open( CALSTREAM *stream,
+ const CALADDR *addr, long options);
+ static CALSTREAM* dummy_close(CALSTREAM *stream, long options);
+ static bool dummy_ping(CALSTREAM *stream);
++static bool dummy_create(CALSTREAM *stream, const char *calendar);
+ static bool dummy_search_range( CALSTREAM *stream,
+ const datetime_t *start,
+ const datetime_t *end);
+@@ -967,18 +1023,28 @@
+ static bool dummy_snooze( CALSTREAM *stream,
+ unsigned long id);
+
++static bool dummy_delete( CALSTREAM *stream,
++ char *calendar);
++
++static bool dummy_rename( CALSTREAM *stream,
++ char *src,char *dest);
++
+ const CALDRIVER dummy_driver =
+ {
+ dummy_valid,
+ dummy_open,
+ dummy_close,
+ dummy_ping,
++ dummy_create,
+ dummy_search_range,
+ dummy_search_alarm,
+ dummy_fetch,
+ dummy_append,
+ dummy_remove,
+ dummy_snooze,
++ dummy_delete,
++ dummy_rename,
++
+ };
+
+
+@@ -1011,6 +1077,12 @@
+ return false;
+ }
+
++bool
++dummy_create(CALSTREAM *stream, const char *calendar)
++{
++ return false;
++}
++
+
+ bool
+ dummy_search_range( CALSTREAM *stream,
+@@ -1052,6 +1124,18 @@
+
+ bool
+ dummy_snooze(CALSTREAM *stream, unsigned long id)
++{
++ return false;
++}
++
++bool
++dummy_delete(CALSTREAM *stream, char *calendar)
++{
++ return false;
++}
++
++bool
++dummy_rename(CALSTREAM *stream, char *src,char *dest)
+ {
+ return false;
+ }
diff --git a/misc/libmcal/files/patch-ak b/misc/libmcal/files/patch-ak
new file mode 100644
index 000000000000..5c84c5ada01d
--- /dev/null
+++ b/misc/libmcal/files/patch-ak
@@ -0,0 +1,106 @@
+--- mcal.h.orig Mon Mar 27 06:00:33 2000
++++ mcal.h Tue Jan 9 04:26:48 2001
+@@ -1,5 +1,6 @@
++
+ /*
+- * $Id: mcal.h,v 1.6 2000/03/27 04:00:33 zircote Exp $
++ * $Id: mcal.h,v 1.10 2001/01/09 03:26:48 markie Exp $
+ * Libmcal - Modular Calendar Access Library
+ * Copyright (C) 1999 Mark Musone and Andrew Skalski
+ *
+@@ -142,6 +143,15 @@
+ size_t bufsize; /* buffer size */
+ };
+
++/* calendar stream struct */
++CALSTREAM {
++ const CALDRIVER *driver; /* stream driver */
++ CALADDR *addr; /* folder address */
++ bool dead; /* dead stream? */
++ weekday_t startofweek; /* first day of week */
++ void *data; /* driver-specific data */
++};
++
+
+ /* calendar driver structure */
+ CALDRIVER {
+@@ -169,7 +179,11 @@
+
+ /* return true if the stream is still alive */
+ bool (*ping)( CALSTREAM *stream);
+-
++
++ /* return true if calendar created ok */
++ bool (*create)( CALSTREAM *stream,
++ const char *calendar);
++
+ /* search the current folder for events between <start> and
+ * <end> (inclusive.) if either lacks a date or is NULL, that
+ * bound will not be checked. if both lack a date or are NULL,
+@@ -222,20 +236,17 @@
+ bool (*store)( CALSTREAM *stream,
+ const CALEVENT *event);
+
++ /* Delete an entire calendar */
++ bool (*delete)( CALSTREAM *stream, char *calendar);
+
+-};
++ bool (*rename)( CALSTREAM *stream,char *src,char *dest);
+
+
+-/* calendar stream struct */
+-CALSTREAM {
+- const CALDRIVER *driver; /* stream driver */
+- CALADDR *addr; /* folder address */
+- bool dead; /* dead stream? */
+- weekday_t startofweek; /* first day of week */
+- void *data; /* driver-specific data */
+ };
+
+
++
++
+ /** calendar client callbacks **/
+
+ /* Called when a stream driver requires a username/password. It is
+@@ -287,8 +298,11 @@
+ /* Disposes of a CALEVENT, returns NULL for convenience. */
+ CALEVENT* calevent_free(CALEVENT *event);
+
++/* Check the validity of an event's fields. */
++bool calevent_valid(const CALEVENT *event);
++
+ /* Routines to set and fetch event attributes. */
+-const char* calevent_getattr(CALEVENT *event, const char *name);
++const char* calevent_getattr(const CALEVENT *event, const char *name);
+ bool calevent_setattr(CALEVENT *event, const char *name,
+ const char *value);
+
+@@ -322,7 +336,10 @@
+ */
+ bool first_day_not_before( int mask, weekday_t *clamp,
+ weekday_t weekstart);
+-
++/* Creates a new calendar
++ */
++bool cal_create(CALSTREAM *stream,const char *calendar);
++
+ /* Returns true if the address is valid for any of the calendar drivers */
+ bool cal_valid(const char *address);
+
+@@ -400,6 +417,15 @@
+ /* Cancels the alarm for event with id of <id>. Returns false on error. */
+ bool cal_snooze( CALSTREAM *stream,
+ unsigned long id);
++
++/* delete an entire calendar */
++
++bool cal_delete( CALSTREAM *stream,
++ char *calendar);
++
++/* rename a calendar */
++bool cal_rename( CALSTREAM *stream,
++ char *src,char *dest);
+
+
+ /* private functions */
diff --git a/misc/libmcal/files/patch-al b/misc/libmcal/files/patch-al
new file mode 100644
index 000000000000..9f0e4019b1ff
--- /dev/null
+++ b/misc/libmcal/files/patch-al
@@ -0,0 +1,479 @@
+--- mstore/mstore.c.orig Mon Mar 27 06:07:12 2000
++++ mstore/mstore.c Tue Dec 11 08:56:58 2001
+@@ -1,4 +1,4 @@
+-/* $Id: mstore.c,v 1.11 2000/03/27 04:07:12 zircote Exp $ */
++/* $Id: mstore.c,v 1.21 2001/05/07 17:37:10 chuck Exp $ */
+
+ #include <stdlib.h>
+ #include <string.h>
+@@ -6,26 +6,33 @@
+ #include <pwd.h>
+ #include <unistd.h>
+ #include <crypt.h>
++
++#ifdef USE_PAM
++#include <security/pam_appl.h>
++#endif /* USE_PAM */
++
+ #include "mcal.h"
+ #include "mstore.h"
+ #include "icap/icaproutines.h"
+
+-
+ #define MSTORE_VER "0.5"
+ #define DATA_T struct mstore_data
+ #define DATA ((DATA_T*) stream->data)
+
+-
++/* mpasswd path define */
++#ifndef MPASSWD_PATH
++#define MPASSWD_PATH "/etc/mpasswd"
++#endif
+
+ static void mstore_freestream(CALSTREAM *stream);
+ static bool mstore_validuser(const char *username,const char *password);
+-static bool mstore_userexists(const char *username);
+
+ static bool mstore_valid(const CALADDR *addr);
+ static CALSTREAM* mstore_open( CALSTREAM *stream,
+ const CALADDR *addr, long options);
+ static CALSTREAM* mstore_close(CALSTREAM *stream, long options);
+ static bool mstore_ping(CALSTREAM *stream);
++static bool mstore_create (CALSTREAM *stream, const char *calendar);
+ static bool mstore_search_range( CALSTREAM *stream,
+ const datetime_t *start,
+ const datetime_t *end);
+@@ -44,12 +51,18 @@
+ unsigned long id);
+ static bool mstore_store( CALSTREAM *stream,
+ const CALEVENT *modified_event);
++static bool mstore_delete( CALSTREAM *stream,
++ char *calendar);
++static bool mstore_rename( CALSTREAM *stream,
++ char *src,char *dest);
++
+ CALDRIVER mstore_driver =
+ {
+ mstore_valid,
+ mstore_open,
+ mstore_close,
+ mstore_ping,
++ mstore_create,
+ mstore_search_range,
+ mstore_search_alarm,
+ mstore_fetch,
+@@ -57,6 +70,8 @@
+ mstore_remove,
+ mstore_snooze,
+ mstore_store,
++ mstore_delete,
++ mstore_rename
+ };
+
+
+@@ -88,13 +103,98 @@
+ }
+
+
++#ifdef USE_PAM
++
++/* PAM support stuff goes here */
++
++static pam_handle_t *pamh = NULL;
++static char *PAM_username;
++static char *PAM_password;
++
++#define COPY_STRING(s) (s) ? strdup(s) : NULL
++
++static int PAM_conv (int num_msg,
++ const struct pam_message **msg,
++ struct pam_response **resp,
++ void *appdata_ptr)
++{
++ struct pam_response *reply;
++ int count;
++
++ if (num_msg < 1)
++ return PAM_CONV_ERR;
++
++ reply = (struct pam_response *)
++ calloc (num_msg, sizeof(struct pam_response));
++
++ if (!reply)
++ return PAM_CONV_ERR;
++
++ for (count=0; count<num_msg; count++) {
++ char *string = NULL;
++
++ switch (msg[count]->msg_style) {
++ case PAM_PROMPT_ECHO_ON:
++ if (!(string = COPY_STRING(PAM_username)))
++ goto pam_fail_conv;
++ break;
++ case PAM_PROMPT_ECHO_OFF:
++ if (!(string = COPY_STRING(PAM_password)))
++ goto pam_fail_conv;
++ break;
++ case PAM_TEXT_INFO:
++#ifdef PAM_BINARY_PROMPT
++ case PAM_BINARY_PROMPT:
++#endif /* PAM_BINARY_PROMPT */
++ /* ignore it */
++ break;
++ case PAM_ERROR_MSG:
++ default:
++ goto pam_fail_conv;
++ } /* end switch msg[count]->msg_style */
++
++ if (string) {
++ reply[count].resp_retcode = 0;
++ reply[count].resp = string;
++ string = NULL;
++ } /* end if string */
++
++ } // end for count
++
++ *resp = reply;
++ return PAM_SUCCESS;
++
++pam_fail_conv:
++ for(count=0; count<num_msg; count++) {
++ if (!reply[count].resp)
++ continue;
++ switch (msg[count]->msg_style) {
++ case PAM_PROMPT_ECHO_ON:
++ case PAM_PROMPT_ECHO_OFF:
++ free(reply[count].resp);
++ break;
++ } /* end switch msg[count]->msg_style */
++ } /* end for count */
++
++ free(reply);
++ return PAM_CONV_ERR;
++} /* end function static int PAM_conv (...) */
++
++static struct pam_conv PAM_conversation = {
++ &PAM_conv,
++ NULL
++};
++
++#endif /* USE_PAM */
++
+ bool
+ mstore_validuser(const char *username,const char *password)
+ {
++#ifndef USE_PAM
+ FILE *mpasswd;
+ char line[1000];
+ char *musername,*mpassword;
+- mpasswd=fopen("/etc/mpasswd","r");
++ mpasswd=fopen(MPASSWD_PATH,"r");
+ if(!mpasswd)
+ {
+ printf("Error! couldn't open mpasswd file!\n");
+@@ -123,36 +223,31 @@
+ }
+ fclose(mpasswd);
+ return false;
+-}
+-
+-
+-bool
+-mstore_userexists(const char *username)
+-{
+- FILE *mpasswd;
+- char line[1000];
+- char *musername,*mpassword;
+- mpasswd=fopen("/etc/mpasswd","r");
+- if(!mpasswd)
+- {
+- printf("Error! couldn't open mpasswd file!\n");
+- exit(1);
+- }
+- while(fgets(line,900,mpasswd))
+- {
+- if(line[strlen(line)-1]=='\n') line[strlen(line)-1]=0x00;
+- musername=line;
+- mpassword=strchr(line,':');
+- *mpassword=0x00;
+- mpassword++;
+- if(!strcmp(username,musername))
+- {
+- fclose(mpasswd);
+- return true;
+- }
+- }
+- fclose(mpasswd);
+- return false;
++#else
++ /* PAM authentication */
++ int PAM_error;
++
++ PAM_error = pam_start("mstore", username, &PAM_conversation, &pamh);
++ if (PAM_error != PAM_SUCCESS)
++ goto login_err;
++ pam_set_item(pamh, PAM_TTY, "mstore");
++ pam_set_item(pamh, PAM_RHOST, "localhost");
++ PAM_error = pam_authenticate(pamh, 0);
++ if (PAM_error != PAM_SUCCESS)
++ if (PAM_error == PAM_MAXTRIES)
++ goto login_err;
++#ifndef PAM_CRED_ESTABLISH
++#define PAM_CRED_ESTABLISH PAM_ESTABLISH_CRED
++#endif /* PAM_CRED_ESTABLISH */
++ PAM_error = pam_setcred(pamh, PAM_CRED_ESTABLISH);
++ if (PAM_error != PAM_SUCCESS)
++ goto login_err;
++
++login_err:
++ pam_end(pamh, PAM_error);
++ pamh = NULL;
++ return false;
++#endif /* ! USE_PAM */
+ }
+
+
+@@ -161,8 +256,6 @@
+ {
+ if (!addr->proto || strcasecmp(addr->proto, "mstore"))
+ return false;
+- if (addr->user && !mstore_userexists(addr->user))
+- return false;
+ return true;
+ }
+
+@@ -197,10 +290,18 @@
+ }
+
+ cc_login(&username, &password);
+- if (username == NULL)
++ if (username == NULL) {
++ #ifdef DEBUG
++ printf("\nNULL username\n");
++ #endif
+ goto fail;
+- if (!mstore_validuser(username,password))
++ }
++ if (!mstore_validuser(username,password)) {
++ #ifdef DEBUG
++ printf("\n!mstore_validuser(%s,%s)\n",username,password);
++ #endif
+ goto fail;
++ }
+ }
+
+ if (!reopen) {
+@@ -212,13 +313,23 @@
+
+ if (options & CAL_LOGIN) {
+ /* Copy login_userbuf, folder. */
+- if ((DATA->login_userbuf = strdup(username)) == NULL)
++ if ((DATA->login_userbuf = strdup(username)) == NULL) {
++ #ifdef DEBUG
++ printf("\ncouldn't get login_userbuf (%s)\n",
++ username);
++ #endif
+ goto fail;
++ }
+
+ }
+
+- if ((DATA->folder = strdup(addr->folder)) == NULL)
++ if ((DATA->folder = strdup(addr->folder)) == NULL) {
++ #ifdef DEBUG
++ printf("\ncouldn't get folder (%s)\n",
++ addr->folder);
++ #endif
+ goto fail;
++ }
+
+ /* Set up folder_user */
+ if(addr->host)
+@@ -229,8 +340,13 @@
+ DATA->login_user=DATA->login_userbuf;
+ if (addr->user) {
+ /* Copy and split folder_userbuf */
+- if ((DATA->folder_userbuf = strdup(addr->user)) == NULL)
++ if ((DATA->folder_userbuf = strdup(addr->user)) == NULL) {
++#ifdef DEBUG
++ printf("\ncouldn't get folder_userbuf (%s)\n",
++ addr->user);
++#endif
+ goto fail;
++ }
+ /* Check for identical folder/login users. */
+ DATA->folder_user=DATA->folder_userbuf;
+ if ( !strcmp(DATA->login_user, DATA->folder_user))
+@@ -246,7 +362,6 @@
+ DATA->folder_user = DATA->login_user;
+ }
+
+-
+ return stream;
+ fail:
+ mstore_freestream(stream);
+@@ -270,6 +385,36 @@
+ }
+
+
++bool
++mstore_create(CALSTREAM *stream, const char *calendar)
++{
++ FILE *calfile;
++ char userpath[1000];
++
++ /*
++ if (!(stream = mstore_open (stream, (const CALADDR *)calendar, 0))) {
++ #ifdef DEBUG
++ printf("Error! couldn't open calendar stream!\n");
++ #endif
++ return false;
++ }
++ */
++ snprintf(userpath, 900, "%s/%s", DATA->base_path, calendar);
++ #ifdef DEBUG
++ printf("attempting fopen on calendar file '%s'\n", userpath);
++ #endif
++ calfile = fopen (userpath, "w");
++ if (!calfile) {
++ #ifdef DEBUG
++ printf("Error! couldn't create calendar file!\n");
++ #endif
++ return false;
++ }
++ fclose (calfile);
++ return true;
++}
++
++
+ CALEVENT *read_event(FILE *calfile)
+ {
+ char line[100];
+@@ -277,7 +422,8 @@
+ int size;
+ CALEVENT *event;
+
+- fgets(line, sizeof(line), calfile);
++ if (fgets(line, sizeof(line), calfile) == NULL)
++ return NULL;
+ if (sscanf(line, "%d", &size) != 1)
+ return NULL;
+ buf = malloc(size + 2);
+@@ -334,17 +480,18 @@
+ datetime_t _end = DT_INIT;
+ FILE *calfile;
+ char userpath[1000];
+- snprintf(userpath,900,"%s/%s",DATA->base_path,DATA->folder_user);
+- calfile=fopen (userpath,"a+");
+- if(!calfile)
+- {
++
++ snprintf(userpath, 900, "%s/%s", DATA->base_path, DATA->folder_user);
++ calfile = fopen (userpath, "a+");
++ if(!calfile) {
+ printf("Error! couldn't open calendar file!\n");
+ exit(1);
+- }
++ }
+ rewind(calfile);
+
+ if (start) {
+ if (!dt_hasdate(start))
++//LM:should this be _start = NULL? and again below for end?
+ start = NULL;
+ else {
+ dt_setdate(&_start,
+@@ -358,7 +505,7 @@
+ dt_setdate(&_end, end->year, end->mon, end->mday);
+ }
+
+- while((event=read_event(calfile))) {
++ while((event = read_event(calfile))) {
+ datetime_t clamp = DT_INIT;
+
+ if (!start)
+@@ -385,28 +532,24 @@
+ bool
+ mstore_search_alarm(CALSTREAM *stream, const datetime_t *when)
+ {
+- datetime_t start;
+- datetime_t end;
+- long alarm = 0;
+- unsigned long id = 0;
+ CALEVENT *event;
+ FILE *calfile;
+ char userpath[1000];
+
+- snprintf(userpath,900,"%s/%s",DATA->base_path,DATA->folder_user);
+- calfile=fopen (userpath,"a+");
+- if(!calfile)
+- {
++ snprintf(userpath, 900, "%s/%s", DATA->base_path, DATA->folder_user);
++ calfile=fopen (userpath, "a+");
++ if(!calfile) {
+ printf("Error! couldn't open calendar file!\n");
+ exit(1);
+- }
++ }
+ rewind(calfile);
+- while((event=read_event(calfile))) {
+- if (dt_roll_time(&(event->start), 0, -alarm, 0) &&
+- dt_compare(&(event->start),&start)<=0 &&
+- dt_compare(&end,&(event->end)) <=0)
++ while ((event = read_event(calfile))) {
++ if (event->alarm &&
++ dt_roll_time(&(event->start), 0, -(event->alarm), 0) &&
++ dt_compare(&(event->start), when) <= 0 &&
++ dt_compare(when, &(event->end)) <=0)
+ {
+- cc_searched(id);
++ cc_searched(event->id);
+ }
+ calevent_free(event);
+ }
+@@ -422,13 +565,12 @@
+ FILE *calfile;
+ char userpath[1000];
+
+- snprintf(userpath,900,"%s/%s",DATA->base_path,DATA->folder_user);
+- calfile=fopen (userpath,"a+");
+- if(!calfile)
+- {
++ snprintf(userpath, 900, "%s/%s", DATA->base_path, DATA->folder_user);
++ calfile = fopen (userpath,"a+");
++ if(!calfile) {
+ printf("Error! couldn't open calendar file!\n");
+ exit(1);
+- }
++ }
+ rewind(calfile);
+ while((event=read_event(calfile))) {
+ if(event->id==id) {
+@@ -459,8 +601,11 @@
+ if (strcasecmp(addr->folder, "INBOX"))
+ return false;
+
++ /* comment this out so that we can share calendars
+ if (DATA->folder_userbuf)
+ return false;
++ */
++
+ if (!dt_hasdate(&event->start))
+ return false;
+
+@@ -609,3 +754,15 @@
+ return true;
+ }
+
++
++bool
++mstore_delete(CALSTREAM *stream, char *calendar)
++{
++ return true;
++}
++
++bool
++mstore_rename(CALSTREAM *stream, char *src,char *dest)
++{
++ return true;
++}