Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/imap/cmd-list.c @ 4639:47531abcf691 HEAD
Handle INBOX-prefixed namespaces better. Avoid duplicate INBOX replies if
namespace prefix is given.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 09 Oct 2006 00:42:38 +0300 |
parents | ca9eaace800a |
children | 5ac887e3a53d |
rev | line source |
---|---|
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
1 /* Copyright (C) 2002-2004 Timo Sirainen */ |
0 | 2 |
3 #include "common.h" | |
1329
ae229b7acb4c
Mailbox names are now sent through imap-quoter instead of just escaping it.
Timo Sirainen <tss@iki.fi>
parents:
1310
diff
changeset
|
4 #include "str.h" |
896
21ffcce83c70
Rewrote rfc822-tokenize.c to work one token at a time so it won't uselessly
Timo Sirainen <tss@iki.fi>
parents:
886
diff
changeset
|
5 #include "strescape.h" |
1329
ae229b7acb4c
Mailbox names are now sent through imap-quoter instead of just escaping it.
Timo Sirainen <tss@iki.fi>
parents:
1310
diff
changeset
|
6 #include "imap-quote.h" |
1218
a70ebd3a59e2
Removed list-sort workarounds. It's pretty much needed for maildir listing.
Timo Sirainen <tss@iki.fi>
parents:
1198
diff
changeset
|
7 #include "imap-match.h" |
0 | 8 #include "commands.h" |
1655 | 9 #include "namespace.h" |
0 | 10 |
1895
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
11 enum { |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
12 _MAILBOX_LIST_HIDE_CHILDREN = 0x1000000, |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
13 _MAILBOX_LIST_LISTEXT = 0x0800000 |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
14 }; |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
15 |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
16 struct cmd_list_context { |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
17 const char *ref; |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
18 const char *mask; |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
19 enum mailbox_list_flags list_flags; |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
20 |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
21 struct namespace *ns; |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
22 struct mailbox_list_context *list_ctx; |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
23 struct imap_match_glob *glob; |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
24 |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
25 unsigned int lsub:1; |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
26 unsigned int inbox_found:1; |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
27 unsigned int match_inbox:1; |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
28 }; |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
29 |
1748
588326f1cd84
If LISTEXT is used and CHILDREN info isn't wanted, don't send it.
Timo Sirainen <tss@iki.fi>
parents:
1657
diff
changeset
|
30 static const char * |
1895
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
31 mailbox_flags2str(enum mailbox_flags flags, enum mailbox_list_flags list_flags) |
0 | 32 { |
33 const char *str; | |
34 | |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
35 if (flags & MAILBOX_PLACEHOLDER) { |
1650
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
1568
diff
changeset
|
36 i_assert((flags & ~MAILBOX_CHILDREN) == MAILBOX_PLACEHOLDER); |
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
1568
diff
changeset
|
37 |
1895
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
38 if ((list_flags & _MAILBOX_LIST_LISTEXT) == 0) |
1650
bc76e08a9c9d
API change: Mailbox list sorting must now always done by storage itself if
Timo Sirainen <tss@iki.fi>
parents:
1568
diff
changeset
|
39 flags = MAILBOX_NOSELECT; |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
40 flags |= MAILBOX_CHILDREN; |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
41 } |
1895
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
42 if ((flags & MAILBOX_NONEXISTENT) != 0 && |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
43 (list_flags & _MAILBOX_LIST_LISTEXT) == 0) { |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
44 flags |= MAILBOX_NOSELECT; |
1895
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
45 flags &= ~MAILBOX_NONEXISTENT; |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
46 } |
1218
a70ebd3a59e2
Removed list-sort workarounds. It's pretty much needed for maildir listing.
Timo Sirainen <tss@iki.fi>
parents:
1198
diff
changeset
|
47 |
1895
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
48 if ((list_flags & _MAILBOX_LIST_HIDE_CHILDREN) != 0) |
1748
588326f1cd84
If LISTEXT is used and CHILDREN info isn't wanted, don't send it.
Timo Sirainen <tss@iki.fi>
parents:
1657
diff
changeset
|
49 flags &= ~(MAILBOX_CHILDREN|MAILBOX_NOCHILDREN); |
588326f1cd84
If LISTEXT is used and CHILDREN info isn't wanted, don't send it.
Timo Sirainen <tss@iki.fi>
parents:
1657
diff
changeset
|
50 |
1890
66e5fdc07ac5
Children/NoChildren -> HasChildren/HasNoChildren
Timo Sirainen <tss@iki.fi>
parents:
1751
diff
changeset
|
51 str = t_strconcat( |
66e5fdc07ac5
Children/NoChildren -> HasChildren/HasNoChildren
Timo Sirainen <tss@iki.fi>
parents:
1751
diff
changeset
|
52 (flags & MAILBOX_NOSELECT) ? " \\Noselect" : "", |
66e5fdc07ac5
Children/NoChildren -> HasChildren/HasNoChildren
Timo Sirainen <tss@iki.fi>
parents:
1751
diff
changeset
|
53 (flags & MAILBOX_NONEXISTENT) ? " \\NonExistent" : "", |
66e5fdc07ac5
Children/NoChildren -> HasChildren/HasNoChildren
Timo Sirainen <tss@iki.fi>
parents:
1751
diff
changeset
|
54 (flags & MAILBOX_PLACEHOLDER) ? " \\PlaceHolder" : "", |
66e5fdc07ac5
Children/NoChildren -> HasChildren/HasNoChildren
Timo Sirainen <tss@iki.fi>
parents:
1751
diff
changeset
|
55 (flags & MAILBOX_CHILDREN) ? " \\HasChildren" : "", |
66e5fdc07ac5
Children/NoChildren -> HasChildren/HasNoChildren
Timo Sirainen <tss@iki.fi>
parents:
1751
diff
changeset
|
56 (flags & MAILBOX_NOCHILDREN) ? " \\HasNoChildren" : "", |
66e5fdc07ac5
Children/NoChildren -> HasChildren/HasNoChildren
Timo Sirainen <tss@iki.fi>
parents:
1751
diff
changeset
|
57 (flags & MAILBOX_NOINFERIORS) ? " \\NoInferiors" : "", |
66e5fdc07ac5
Children/NoChildren -> HasChildren/HasNoChildren
Timo Sirainen <tss@iki.fi>
parents:
1751
diff
changeset
|
58 (flags & MAILBOX_MARKED) ? " \\Marked" : "", |
66e5fdc07ac5
Children/NoChildren -> HasChildren/HasNoChildren
Timo Sirainen <tss@iki.fi>
parents:
1751
diff
changeset
|
59 (flags & MAILBOX_UNMARKED) ? " \\UnMarked" : "", |
66e5fdc07ac5
Children/NoChildren -> HasChildren/HasNoChildren
Timo Sirainen <tss@iki.fi>
parents:
1751
diff
changeset
|
60 NULL); |
0 | 61 |
62 return *str == '\0' ? "" : str+1; | |
63 } | |
64 | |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3856
diff
changeset
|
65 static bool |
3141
61abed5f7864
Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents:
2590
diff
changeset
|
66 parse_list_flags(struct client_command_context *cmd, struct imap_arg *args, |
61abed5f7864
Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents:
2590
diff
changeset
|
67 enum mailbox_list_flags *list_flags) |
1198
d28571e8c810
Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents:
1183
diff
changeset
|
68 { |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
69 const char *atom; |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
70 |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
71 while (args->type != IMAP_ARG_EOL) { |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
72 if (args->type != IMAP_ARG_ATOM) { |
3141
61abed5f7864
Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents:
2590
diff
changeset
|
73 client_send_command_error(cmd, |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
74 "List options contains non-atoms."); |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
75 return FALSE; |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
76 } |
1198
d28571e8c810
Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents:
1183
diff
changeset
|
77 |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
78 atom = IMAP_ARG_STR(args); |
1198
d28571e8c810
Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents:
1183
diff
changeset
|
79 |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
80 if (strcasecmp(atom, "SUBSCRIBED") == 0) |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
81 *list_flags |= MAILBOX_LIST_SUBSCRIBED; |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
82 else if (strcasecmp(atom, "CHILDREN") == 0) |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
83 *list_flags |= MAILBOX_LIST_CHILDREN; |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
84 else { |
3141
61abed5f7864
Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents:
2590
diff
changeset
|
85 client_send_tagline(cmd, t_strconcat( |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
86 "BAD Invalid list option ", atom, NULL)); |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
87 return FALSE; |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
88 } |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
89 args++; |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
90 } |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
91 return TRUE; |
1198
d28571e8c810
Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents:
1183
diff
changeset
|
92 } |
d28571e8c810
Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents:
1183
diff
changeset
|
93 |
3856
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
94 static void |
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
95 list_namespace_inbox(struct client *client, struct cmd_list_context *ctx) |
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
96 { |
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
97 const char *str; |
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
98 |
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
99 if (!ctx->inbox_found && ctx->ns->inbox && ctx->match_inbox && |
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
100 (ctx->list_flags & MAILBOX_LIST_SUBSCRIBED) == 0) { |
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
101 /* INBOX always exists */ |
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
102 str = t_strdup_printf("* LIST (\\Unmarked) \"%s\" \"INBOX\"", |
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
103 ctx->ns->sep_str); |
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
104 client_send_line(client, str); |
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
105 } |
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
106 } |
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
107 |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
108 static int |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
109 list_namespace_mailboxes(struct client *client, struct cmd_list_context *ctx) |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
110 { |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
111 struct mailbox_list *list; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
112 const char *name; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
113 string_t *str, *name_str; |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
114 int ret; |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
115 |
3856
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
116 if (ctx->list_ctx == NULL) { |
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
117 list_namespace_inbox(client, ctx); |
2537
5c95f17f6f25
Fix for having INBOX/ namespace.
Timo Sirainen <tss@iki.fi>
parents:
2425
diff
changeset
|
118 return 1; |
3856
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
119 } |
2537
5c95f17f6f25
Fix for having INBOX/ namespace.
Timo Sirainen <tss@iki.fi>
parents:
2425
diff
changeset
|
120 |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
121 t_push(); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
122 str = t_str_new(256); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
123 name_str = t_str_new(256); |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
124 while ((list = mail_storage_mailbox_list_next(ctx->list_ctx)) != NULL) { |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
125 str_truncate(name_str, 0); |
4546
ca9eaace800a
When listing INBOX from inbox=yes namespace, don't insert the
Timo Sirainen <tss@iki.fi>
parents:
4545
diff
changeset
|
126 /* when listing INBOX from inbox=yes namespace, don't insert |
ca9eaace800a
When listing INBOX from inbox=yes namespace, don't insert the
Timo Sirainen <tss@iki.fi>
parents:
4545
diff
changeset
|
127 the namespace prefix */ |
ca9eaace800a
When listing INBOX from inbox=yes namespace, don't insert the
Timo Sirainen <tss@iki.fi>
parents:
4545
diff
changeset
|
128 if (strcasecmp(list->name, "INBOX") != 0 || !ctx->ns->inbox) |
ca9eaace800a
When listing INBOX from inbox=yes namespace, don't insert the
Timo Sirainen <tss@iki.fi>
parents:
4545
diff
changeset
|
129 str_append(name_str, ctx->ns->prefix); |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
130 str_append(name_str, list->name); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
131 |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
132 if (ctx->ns->sep != ctx->ns->real_sep) { |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
133 char *p = str_c_modifiable(name_str); |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
134 for (; *p != '\0'; p++) { |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
135 if (*p == ctx->ns->real_sep) |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
136 *p = ctx->ns->sep; |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
137 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
138 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
139 name = str_c(name_str); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
140 |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
141 if (*ctx->ns->prefix != '\0') { |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
142 /* With masks containing '*' we do the checks here |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
143 so prefix is included in matching */ |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
144 if (ctx->glob != NULL && |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
145 imap_match(ctx->glob, name) != IMAP_MATCH_YES) |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
146 continue; |
4639
47531abcf691
Handle INBOX-prefixed namespaces better. Avoid duplicate INBOX replies if
Timo Sirainen <tss@iki.fi>
parents:
4546
diff
changeset
|
147 } |
47531abcf691
Handle INBOX-prefixed namespaces better. Avoid duplicate INBOX replies if
Timo Sirainen <tss@iki.fi>
parents:
4546
diff
changeset
|
148 if (strcasecmp(name, "INBOX") == 0) { |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
149 if (!ctx->ns->inbox) |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
150 continue; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
151 |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
152 name = "INBOX"; |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
153 ctx->inbox_found = TRUE; |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
154 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
155 |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
156 str_truncate(str, 0); |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
157 str_printfa(str, "* %s (%s) \"%s\" ", |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
158 ctx->lsub ? "LSUB" : "LIST", |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
159 mailbox_flags2str(list->flags, ctx->list_flags), |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
160 ctx->ns->sep_str); |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
161 imap_quote_append_string(str, name, FALSE); |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
162 if (client_send_line(client, str_c(str)) == 0) { |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
163 /* buffer is full, continue later */ |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
164 t_pop(); |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
165 return 0; |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
166 } |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
167 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
168 |
3856
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
169 list_namespace_inbox(client, ctx); |
2365 | 170 t_pop(); |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
171 |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3876
diff
changeset
|
172 ret = mail_storage_mailbox_list_deinit(&ctx->list_ctx); |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
173 ctx->list_ctx = NULL; |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
174 return ret < 0 ? -1 : 1; |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
175 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
176 |
3875
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
177 static bool list_mask_has_wildcards(const char *mask) |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
178 { |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
179 for (; *mask != '\0'; mask++) { |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
180 if (*mask == '%' || *mask == '*') |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
181 return TRUE; |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
182 } |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
183 return FALSE; |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
184 } |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
185 |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
186 static void |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
187 skip_namespace_prefix(const char **prefix, const char **mask, |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
188 bool inbox_check, char sep) |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
189 { |
3856
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
190 size_t mask_len, prefix_len; |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3856
diff
changeset
|
191 bool match; |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
192 |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
193 prefix_len = strlen(*prefix); |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
194 mask_len = strlen(*mask); |
3856
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
195 |
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
196 if (mask_len < prefix_len) { |
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
197 /* eg. namespace prefix = "INBOX.", mask = "INBOX" */ |
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
198 return; |
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
199 } |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
200 |
3856
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
201 match = strncmp(*prefix, *mask, prefix_len) == 0; |
3875
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
202 if (!match && inbox_check) { |
3856
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
203 /* try INBOX check. */ |
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
204 match = prefix_len >= 5 && |
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
205 strncasecmp(*prefix, *mask, 5) == 0 && |
3875
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
206 strncmp(*prefix + 5, *mask + 5, prefix_len - 5) == 0 && |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
207 strncasecmp(*prefix, "INBOX", 5) == 0 && |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
208 ((*prefix)[5] == sep || (*prefix)[5] == '\0'); |
3856
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
209 } |
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
210 |
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
211 if (match) { |
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
212 *prefix += prefix_len; |
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
213 *mask += prefix_len; |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
214 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
215 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
216 |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
217 static void |
3141
61abed5f7864
Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents:
2590
diff
changeset
|
218 list_namespace_init(struct client_command_context *cmd, |
61abed5f7864
Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents:
2590
diff
changeset
|
219 struct cmd_list_context *ctx) |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
220 { |
3141
61abed5f7864
Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents:
2590
diff
changeset
|
221 struct client *client = cmd->client; |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
222 struct namespace *ns = ctx->ns; |
3875
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
223 const char *cur_ns_prefix, *cur_ref, *cur_mask; |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
224 enum imap_match_result match; |
2589
3a9a34bc0d05
Added MAILBOX_LIST_INBOX flag. Do the special cased INBOX handling only if
Timo Sirainen <tss@iki.fi>
parents:
2537
diff
changeset
|
225 enum mailbox_list_flags list_flags; |
4545
5ab638aafc7b
Fixes to handling INBOX in LIST.
Timo Sirainen <tss@iki.fi>
parents:
4542
diff
changeset
|
226 enum imap_match_result inbox_match; |
5ab638aafc7b
Fixes to handling INBOX in LIST.
Timo Sirainen <tss@iki.fi>
parents:
4542
diff
changeset
|
227 struct imap_match_glob *inbox_glob; |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
228 unsigned int count; |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
229 size_t len; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
230 |
3875
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
231 cur_ns_prefix = ns->prefix; |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
232 cur_ref = ctx->ref; |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
233 cur_mask = ctx->mask; |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
234 |
3875
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
235 if (*cur_ref != '\0' && *cur_ns_prefix != '\0') { |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
236 /* reference argument given. skip namespace prefix using it. |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
237 |
3875
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
238 cur_ns_prefix = foo/bar/ |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
239 cur_ref = foo/ |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
240 -> cur_ns_prefix=bar/, cur_ref="" |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
241 cur_ref = foo/bar/baz |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
242 -> cur_ns_prefix="", cur_ref="baz" |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
243 */ |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
244 skip_namespace_prefix(&cur_ns_prefix, &cur_ref, TRUE, ns->sep); |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
245 |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
246 if (*cur_ref != '\0' && *cur_ns_prefix != '\0') { |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
247 /* reference parameter didn't match with |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
248 namespace prefix. skip this. */ |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
249 return; |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
250 } |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
251 } |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
252 |
3875
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
253 if (*cur_ns_prefix != '\0') { |
3856
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
254 /* no reference parameter. skip namespace prefix from mask. */ |
3875
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
255 const char *old_ns_prefix = cur_ns_prefix; |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
256 const char *old_mask = cur_mask; |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
257 |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
258 i_assert(*cur_ref == '\0'); |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
259 |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
260 skip_namespace_prefix(&cur_ns_prefix, &cur_mask, |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
261 cur_ref == ctx->ref, ns->sep); |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
262 |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
263 if (*cur_mask == '\0' && *cur_ns_prefix == '\0') { |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
264 /* trying to list the namespace prefix itself. */ |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
265 cur_ns_prefix = old_ns_prefix; |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
266 cur_mask = old_mask; |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
267 } |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
268 } |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
269 |
4545
5ab638aafc7b
Fixes to handling INBOX in LIST.
Timo Sirainen <tss@iki.fi>
parents:
4542
diff
changeset
|
270 /* if the original reference and mask combined produces something |
5ab638aafc7b
Fixes to handling INBOX in LIST.
Timo Sirainen <tss@iki.fi>
parents:
4542
diff
changeset
|
271 that matches INBOX, the INBOX casing is on. */ |
5ab638aafc7b
Fixes to handling INBOX in LIST.
Timo Sirainen <tss@iki.fi>
parents:
4542
diff
changeset
|
272 inbox_glob = imap_match_init(cmd->pool, |
5ab638aafc7b
Fixes to handling INBOX in LIST.
Timo Sirainen <tss@iki.fi>
parents:
4542
diff
changeset
|
273 t_strconcat(ctx->ref, ctx->mask, NULL), |
5ab638aafc7b
Fixes to handling INBOX in LIST.
Timo Sirainen <tss@iki.fi>
parents:
4542
diff
changeset
|
274 TRUE, ns->sep); |
5ab638aafc7b
Fixes to handling INBOX in LIST.
Timo Sirainen <tss@iki.fi>
parents:
4542
diff
changeset
|
275 inbox_match = imap_match(inbox_glob, "INBOX"); |
5ab638aafc7b
Fixes to handling INBOX in LIST.
Timo Sirainen <tss@iki.fi>
parents:
4542
diff
changeset
|
276 ctx->match_inbox = inbox_match == IMAP_MATCH_YES; |
5ab638aafc7b
Fixes to handling INBOX in LIST.
Timo Sirainen <tss@iki.fi>
parents:
4542
diff
changeset
|
277 |
3141
61abed5f7864
Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents:
2590
diff
changeset
|
278 ctx->glob = imap_match_init(cmd->pool, ctx->mask, |
4545
5ab638aafc7b
Fixes to handling INBOX in LIST.
Timo Sirainen <tss@iki.fi>
parents:
4542
diff
changeset
|
279 (inbox_match == IMAP_MATCH_YES || |
5ab638aafc7b
Fixes to handling INBOX in LIST.
Timo Sirainen <tss@iki.fi>
parents:
4542
diff
changeset
|
280 inbox_match == IMAP_MATCH_PARENT) && |
5ab638aafc7b
Fixes to handling INBOX in LIST.
Timo Sirainen <tss@iki.fi>
parents:
4542
diff
changeset
|
281 cur_mask == ctx->mask, |
5ab638aafc7b
Fixes to handling INBOX in LIST.
Timo Sirainen <tss@iki.fi>
parents:
4542
diff
changeset
|
282 ns->sep); |
3875
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
283 |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
284 if (*cur_ns_prefix != '\0') { |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
285 /* namespace prefix still wasn't completely skipped over. |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
286 for example cur_ns_prefix=INBOX/, mask=%/% or mask=IN%. |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
287 Check that mask matches namespace prefix. */ |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
288 bool skip_trailing_sep = FALSE; |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
289 i_assert(*cur_ref == '\0'); |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
290 |
3875
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
291 /* drop the trailing separator in namespace prefix. |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
292 don't do it if we're listing only the prefix itself. */ |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
293 len = strlen(cur_ns_prefix); |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
294 if (cur_ns_prefix[len-1] == ns->sep && |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
295 strcmp(cur_mask, cur_ns_prefix) != 0) { |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
296 skip_trailing_sep = TRUE; |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
297 cur_ns_prefix = t_strndup(cur_ns_prefix, len-1); |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
298 } |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
299 |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
300 /* hidden namespaces should still be seen without wildcards. |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
301 some clients rely on this. */ |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
302 match = (ns->hidden && list_mask_has_wildcards(cur_mask)) ? |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
303 IMAP_MATCH_NO : imap_match(ctx->glob, cur_ns_prefix); |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
304 if (match < 0) |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
305 return; |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
306 |
4639
47531abcf691
Handle INBOX-prefixed namespaces better. Avoid duplicate INBOX replies if
Timo Sirainen <tss@iki.fi>
parents:
4546
diff
changeset
|
307 len = strlen(ns->prefix); |
3305
cccb5c6ba946
LSUB was returning namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3217
diff
changeset
|
308 if (match == IMAP_MATCH_YES && |
4639
47531abcf691
Handle INBOX-prefixed namespaces better. Avoid duplicate INBOX replies if
Timo Sirainen <tss@iki.fi>
parents:
4546
diff
changeset
|
309 (ctx->list_flags & MAILBOX_LIST_SUBSCRIBED) == 0 && |
47531abcf691
Handle INBOX-prefixed namespaces better. Avoid duplicate INBOX replies if
Timo Sirainen <tss@iki.fi>
parents:
4546
diff
changeset
|
310 (!ctx->ns->inbox || |
47531abcf691
Handle INBOX-prefixed namespaces better. Avoid duplicate INBOX replies if
Timo Sirainen <tss@iki.fi>
parents:
4546
diff
changeset
|
311 strncmp(ns->prefix, "INBOX", len-1) != 0)) { |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
312 /* The prefix itself matches */ |
2537
5c95f17f6f25
Fix for having INBOX/ namespace.
Timo Sirainen <tss@iki.fi>
parents:
2425
diff
changeset
|
313 enum mailbox_flags flags; |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
314 string_t *str = t_str_new(128); |
2537
5c95f17f6f25
Fix for having INBOX/ namespace.
Timo Sirainen <tss@iki.fi>
parents:
2425
diff
changeset
|
315 |
4639
47531abcf691
Handle INBOX-prefixed namespaces better. Avoid duplicate INBOX replies if
Timo Sirainen <tss@iki.fi>
parents:
4546
diff
changeset
|
316 flags = MAILBOX_PLACEHOLDER; |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
317 str_printfa(str, "* LIST (%s) \"%s\" ", |
2537
5c95f17f6f25
Fix for having INBOX/ namespace.
Timo Sirainen <tss@iki.fi>
parents:
2425
diff
changeset
|
318 mailbox_flags2str(flags, ctx->list_flags), |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
319 ns->sep_str); |
3875
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
320 imap_quote_append_string(str, skip_trailing_sep ? |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
321 t_strndup(ns->prefix, len-1) : ns->prefix, |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
322 FALSE); |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
323 client_send_line(client, str_c(str)); |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
324 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
325 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
326 |
3856
b97de2e354bd
Fixes to handling namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
3305
diff
changeset
|
327 |
3875
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
328 if (*cur_ns_prefix != '\0') { |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
329 /* We didn't skip over the whole namespace prefix. For example |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
330 cur_ns_prefix=INBOX/ and mask=%/% or IN*. |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
331 |
3875
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
332 We have already verified that the mask matches the namespace |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
333 prefix, so we'll just have to skip over as many hierarchies |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
334 from mask as there exists in namespace prefix. |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
335 |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
336 The "INBOX" namespace match reply was already sent. We're |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
337 only listing the actual mailboxes now. */ |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
338 i_assert(*cur_ref == '\0'); |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
339 |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
340 for (count = 1; *cur_ns_prefix != '\0'; cur_ns_prefix++) { |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
341 if (*cur_ns_prefix == ns->sep) |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
342 count++; |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
343 } |
3875
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
344 |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
345 for (; count > 0; count--) { |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
346 /* skip over one hierarchy */ |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
347 while (*cur_mask != '\0' && *cur_mask != '*' && |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
348 *cur_mask != ns->sep) |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
349 cur_mask++; |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
350 |
3875
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
351 if (*cur_mask == '*') { |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
352 /* we'll just request "*" and filter it |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
353 ourself. otherwise this gets too complex. */ |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
354 cur_mask = "*"; |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
355 break; |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
356 } |
3875
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
357 if (*cur_mask == '\0') { |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
358 /* mask ended too early. we won't be listing |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
359 any mailboxes. */ |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
360 break; |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
361 } |
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
362 cur_mask++; |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
363 } |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
364 } |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
365 |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
366 if (*cur_mask != '*' || strcmp(ctx->mask, "*") == 0) { |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
367 /* a) we don't have '*' in mask |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
368 b) we want to display everything |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
369 |
3875
e5abc07d843f
Cleaned up and added comments. Also added some kludging so that listing
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
370 we don't need to do separate filtering ourself */ |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
371 ctx->glob = NULL; |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
372 } |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
373 |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
374 cur_ref = namespace_fix_sep(ns, cur_ref); |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
375 cur_mask = namespace_fix_sep(ns, cur_mask); |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
376 |
2589
3a9a34bc0d05
Added MAILBOX_LIST_INBOX flag. Do the special cased INBOX handling only if
Timo Sirainen <tss@iki.fi>
parents:
2537
diff
changeset
|
377 list_flags = ctx->list_flags; |
4545
5ab638aafc7b
Fixes to handling INBOX in LIST.
Timo Sirainen <tss@iki.fi>
parents:
4542
diff
changeset
|
378 if ((*ns->prefix == '\0' || ns->inbox) && ctx->match_inbox) |
2589
3a9a34bc0d05
Added MAILBOX_LIST_INBOX flag. Do the special cased INBOX handling only if
Timo Sirainen <tss@iki.fi>
parents:
2537
diff
changeset
|
379 list_flags |= MAILBOX_LIST_INBOX; |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
380 ctx->list_ctx = mail_storage_mailbox_list_init(ns->storage, |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
381 cur_ref, cur_mask, |
2589
3a9a34bc0d05
Added MAILBOX_LIST_INBOX flag. Do the special cased INBOX handling only if
Timo Sirainen <tss@iki.fi>
parents:
2537
diff
changeset
|
382 list_flags); |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
383 } |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
384 |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3856
diff
changeset
|
385 static bool cmd_list_continue(struct client_command_context *cmd) |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
386 { |
3141
61abed5f7864
Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents:
2590
diff
changeset
|
387 struct client *client = cmd->client; |
61abed5f7864
Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents:
2590
diff
changeset
|
388 struct cmd_list_context *ctx = cmd->context; |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
389 int ret; |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
390 |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
391 for (; ctx->ns != NULL; ctx->ns = ctx->ns->next) { |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
392 if (ctx->list_ctx == NULL) |
3141
61abed5f7864
Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents:
2590
diff
changeset
|
393 list_namespace_init(cmd, ctx); |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
394 |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
395 if ((ret = list_namespace_mailboxes(client, ctx)) < 0) { |
3141
61abed5f7864
Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents:
2590
diff
changeset
|
396 client_send_storage_error(cmd, ctx->ns->storage); |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
397 return TRUE; |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
398 } |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
399 if (ret == 0) |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
400 return FALSE; |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
401 } |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
402 |
3141
61abed5f7864
Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents:
2590
diff
changeset
|
403 client_send_tagline(cmd, !ctx->lsub ? |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
404 "OK List completed." : |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
405 "OK Lsub completed."); |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
406 return TRUE; |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
407 } |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
408 |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3856
diff
changeset
|
409 bool _cmd_list_full(struct client_command_context *cmd, bool lsub) |
0 | 410 { |
3141
61abed5f7864
Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents:
2590
diff
changeset
|
411 struct client *client = cmd->client; |
1657 | 412 struct namespace *ns; |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
413 struct imap_arg *args; |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
414 enum mailbox_list_flags list_flags; |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
415 struct cmd_list_context *ctx; |
1198
d28571e8c810
Rewrote LIST, LSUB and subscription file handling. LIST replies aren't
Timo Sirainen <tss@iki.fi>
parents:
1183
diff
changeset
|
416 const char *ref, *mask; |
0 | 417 |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
418 /* [(<options>)] <reference> <mailbox wildcards> */ |
3141
61abed5f7864
Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents:
2590
diff
changeset
|
419 if (!client_read_args(cmd, 0, 0, &args)) |
0 | 420 return FALSE; |
421 | |
1895
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
422 if (lsub) { |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
423 /* LSUB - we don't care about flags */ |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
424 list_flags = MAILBOX_LIST_SUBSCRIBED | MAILBOX_LIST_FAST_FLAGS | |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
425 _MAILBOX_LIST_HIDE_CHILDREN; |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
426 } else if (args[0].type != IMAP_ARG_LIST) { |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
427 /* LIST - allow children flags, but don't require them */ |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
428 list_flags = 0; |
1895
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
429 } else { |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
430 list_flags = _MAILBOX_LIST_LISTEXT; |
3141
61abed5f7864
Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents:
2590
diff
changeset
|
431 if (!parse_list_flags(cmd, IMAP_ARG_LIST(&args[0])->args, |
1895
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
432 &list_flags)) |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
433 return TRUE; |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
434 args++; |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
435 |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
436 /* don't show children flags unless explicitly specified */ |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
437 if ((list_flags & MAILBOX_LIST_CHILDREN) == 0) |
bbdce1697239
LSUB should never show \HasChildren flags.
Timo Sirainen <tss@iki.fi>
parents:
1890
diff
changeset
|
438 list_flags |= _MAILBOX_LIST_HIDE_CHILDREN; |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
439 } |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
440 |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
441 ref = imap_arg_string(&args[0]); |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
442 mask = imap_arg_string(&args[1]); |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
443 |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
444 if (ref == NULL || mask == NULL) { |
3141
61abed5f7864
Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents:
2590
diff
changeset
|
445 client_send_command_error(cmd, "Invalid arguments."); |
1244
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
446 return TRUE; |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
447 } |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
448 |
40bae47bdba1
Added support for CHILDREN and LISTEXT extensions.
Timo Sirainen <tss@iki.fi>
parents:
1218
diff
changeset
|
449 if (*mask == '\0' && !lsub) { |
3217
23e5925c48dd
We weren't returning "root name" properly with LIST <ref> "".
Timo Sirainen <tss@iki.fi>
parents:
3141
diff
changeset
|
450 /* special request to return the hierarchy delimiter and |
23e5925c48dd
We weren't returning "root name" properly with LIST <ref> "".
Timo Sirainen <tss@iki.fi>
parents:
3141
diff
changeset
|
451 mailbox root name. Mailbox root name is somewhat strange |
23e5925c48dd
We weren't returning "root name" properly with LIST <ref> "".
Timo Sirainen <tss@iki.fi>
parents:
3141
diff
changeset
|
452 concept which probably no other client uses than Pine. |
23e5925c48dd
We weren't returning "root name" properly with LIST <ref> "".
Timo Sirainen <tss@iki.fi>
parents:
3141
diff
changeset
|
453 Just try our best to emulate UW-IMAP behavior and hopefully |
23e5925c48dd
We weren't returning "root name" properly with LIST <ref> "".
Timo Sirainen <tss@iki.fi>
parents:
3141
diff
changeset
|
454 we're fine. */ |
3876
a291d41bc50d
Fixes to returning namespace root with "" mask.
Timo Sirainen <tss@iki.fi>
parents:
3875
diff
changeset
|
455 ns = namespace_find_visible(client->namespaces, &ref); |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
456 if (ns == NULL) { |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
457 const char *empty = ""; |
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
458 ns = namespace_find(client->namespaces, &empty); |
0 | 459 } |
460 | |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
461 if (ns != NULL) { |
3217
23e5925c48dd
We weren't returning "root name" properly with LIST <ref> "".
Timo Sirainen <tss@iki.fi>
parents:
3141
diff
changeset
|
462 string_t *str = t_str_new(64); |
23e5925c48dd
We weren't returning "root name" properly with LIST <ref> "".
Timo Sirainen <tss@iki.fi>
parents:
3141
diff
changeset
|
463 |
23e5925c48dd
We weren't returning "root name" properly with LIST <ref> "".
Timo Sirainen <tss@iki.fi>
parents:
3141
diff
changeset
|
464 str_printfa(str, "* LIST (\\Noselect) \"%s\" ", |
23e5925c48dd
We weren't returning "root name" properly with LIST <ref> "".
Timo Sirainen <tss@iki.fi>
parents:
3141
diff
changeset
|
465 ns->sep_str); |
23e5925c48dd
We weren't returning "root name" properly with LIST <ref> "".
Timo Sirainen <tss@iki.fi>
parents:
3141
diff
changeset
|
466 if (*ns->prefix != '\0' && !ns->hidden) { |
23e5925c48dd
We weren't returning "root name" properly with LIST <ref> "".
Timo Sirainen <tss@iki.fi>
parents:
3141
diff
changeset
|
467 /* public namespace, use it as the root name */ |
23e5925c48dd
We weren't returning "root name" properly with LIST <ref> "".
Timo Sirainen <tss@iki.fi>
parents:
3141
diff
changeset
|
468 imap_quote_append_string(str, ns->prefix, |
23e5925c48dd
We weren't returning "root name" properly with LIST <ref> "".
Timo Sirainen <tss@iki.fi>
parents:
3141
diff
changeset
|
469 FALSE); |
23e5925c48dd
We weren't returning "root name" properly with LIST <ref> "".
Timo Sirainen <tss@iki.fi>
parents:
3141
diff
changeset
|
470 } else { |
23e5925c48dd
We weren't returning "root name" properly with LIST <ref> "".
Timo Sirainen <tss@iki.fi>
parents:
3141
diff
changeset
|
471 /* private namespace, or empty namespace |
23e5925c48dd
We weren't returning "root name" properly with LIST <ref> "".
Timo Sirainen <tss@iki.fi>
parents:
3141
diff
changeset
|
472 prefix. use the mailbox name's first part |
23e5925c48dd
We weren't returning "root name" properly with LIST <ref> "".
Timo Sirainen <tss@iki.fi>
parents:
3141
diff
changeset
|
473 as the root. */ |
23e5925c48dd
We weren't returning "root name" properly with LIST <ref> "".
Timo Sirainen <tss@iki.fi>
parents:
3141
diff
changeset
|
474 const char *p = strchr(ref, ns->sep); |
23e5925c48dd
We weren't returning "root name" properly with LIST <ref> "".
Timo Sirainen <tss@iki.fi>
parents:
3141
diff
changeset
|
475 |
23e5925c48dd
We weren't returning "root name" properly with LIST <ref> "".
Timo Sirainen <tss@iki.fi>
parents:
3141
diff
changeset
|
476 if (p == NULL) |
23e5925c48dd
We weren't returning "root name" properly with LIST <ref> "".
Timo Sirainen <tss@iki.fi>
parents:
3141
diff
changeset
|
477 str_append(str, "\"\""); |
23e5925c48dd
We weren't returning "root name" properly with LIST <ref> "".
Timo Sirainen <tss@iki.fi>
parents:
3141
diff
changeset
|
478 else { |
23e5925c48dd
We weren't returning "root name" properly with LIST <ref> "".
Timo Sirainen <tss@iki.fi>
parents:
3141
diff
changeset
|
479 imap_quote_append_string(str, |
23e5925c48dd
We weren't returning "root name" properly with LIST <ref> "".
Timo Sirainen <tss@iki.fi>
parents:
3141
diff
changeset
|
480 t_strdup_until(ref, p + 1), |
23e5925c48dd
We weren't returning "root name" properly with LIST <ref> "".
Timo Sirainen <tss@iki.fi>
parents:
3141
diff
changeset
|
481 FALSE); |
23e5925c48dd
We weren't returning "root name" properly with LIST <ref> "".
Timo Sirainen <tss@iki.fi>
parents:
3141
diff
changeset
|
482 } |
23e5925c48dd
We weren't returning "root name" properly with LIST <ref> "".
Timo Sirainen <tss@iki.fi>
parents:
3141
diff
changeset
|
483 } |
23e5925c48dd
We weren't returning "root name" properly with LIST <ref> "".
Timo Sirainen <tss@iki.fi>
parents:
3141
diff
changeset
|
484 client_send_line(client, str_c(str)); |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
485 } |
3141
61abed5f7864
Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents:
2590
diff
changeset
|
486 client_send_tagline(cmd, "OK List completed."); |
2350
1371d41c375f
Moved namespace and hierarchy separator handling to imap-specific code. LIST
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
487 } else { |
3141
61abed5f7864
Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents:
2590
diff
changeset
|
488 ctx = p_new(cmd->pool, struct cmd_list_context, 1); |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
489 ctx->ref = ref; |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
490 ctx->mask = mask; |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
491 ctx->list_flags = list_flags; |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
492 ctx->lsub = lsub; |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
493 ctx->ns = client->namespaces; |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
494 |
3141
61abed5f7864
Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents:
2590
diff
changeset
|
495 cmd->context = ctx; |
61abed5f7864
Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents:
2590
diff
changeset
|
496 if (!cmd_list_continue(cmd)) { |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
497 /* unfinished */ |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
498 client->command_pending = TRUE; |
3141
61abed5f7864
Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents:
2590
diff
changeset
|
499 cmd->func = cmd_list_continue; |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
500 return FALSE; |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
501 } |
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
502 |
3141
61abed5f7864
Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents:
2590
diff
changeset
|
503 cmd->context = NULL; |
2425
8267d11cacfb
LIST command interrupts itself when output buffer gets full and continues
Timo Sirainen <tss@iki.fi>
parents:
2374
diff
changeset
|
504 return TRUE; |
0 | 505 } |
506 return TRUE; | |
507 } | |
508 | |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3856
diff
changeset
|
509 bool cmd_list(struct client_command_context *cmd) |
0 | 510 { |
3141
61abed5f7864
Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents:
2590
diff
changeset
|
511 return _cmd_list_full(cmd, FALSE); |
0 | 512 } |