1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
--- a/libtac/include/libtac.h
+++ b/libtac/include/libtac.h
@@ -154,6 +154,8 @@ int tac_author_send(int, const char *, c
int tac_author_read(int, struct areply *);
int tac_add_attrib_pair(struct tac_attrib **, char *, char,
char *);
+int tac_add_attrib_truncate(struct tac_attrib **attr, char *name, char *value);
+int tac_add_attrib_pair_truncate(struct tac_attrib **attr, char *name, char sep, char *value);
int tac_read_wait(int, int, int, int *);
/* magic.c */
--- a/libtac/lib/attrib.c
+++ b/libtac/lib/attrib.c
@@ -20,14 +20,14 @@
* See `CHANGES' file for revision history.
*/
+#include <stdbool.h>
+
#include "libtac.h"
#include "xalloc.h"
-int tac_add_attrib(struct tac_attrib **attr, char *name, char *value) {
- return tac_add_attrib_pair(attr, name, '=', value);
-}
-
-int tac_add_attrib_pair(struct tac_attrib **attr, char *name, char sep, char *value) {
+static int _tac_add_attrib_pair(struct tac_attrib **attr, char *name,
+ char sep, char *value, bool truncate)
+{
struct tac_attrib *a;
size_t l1 = strlen(name);
size_t l2;
@@ -49,10 +49,15 @@ int tac_add_attrib_pair(struct tac_attri
}
if (l2 > TAC_PLUS_ATTRIB_MAX_LEN-total_len) {
- TACSYSLOG((LOG_WARNING,\
- "%s: attribute `%s' total length exceeds %d characters, skipping",\
- __FUNCTION__, name, TAC_PLUS_ATTRIB_MAX_LEN))
- return LIBTAC_STATUS_ATTRIB_TOO_LONG;
+ if (truncate) {
+ l2 = TAC_PLUS_ATTRIB_MAX_LEN-total_len;
+ }
+ else {
+ TACSYSLOG((LOG_WARNING,\
+ "%s: attribute `%s' total length exceeds %d characters, skipping",\
+ __FUNCTION__, name, TAC_PLUS_ATTRIB_MAX_LEN))
+ return LIBTAC_STATUS_ATTRIB_TOO_LONG;
+ }
}
total_len += l2;
@@ -89,6 +94,22 @@ int tac_add_attrib_pair(struct tac_attri
return 0;
}
+int tac_add_attrib(struct tac_attrib **attr, char *name, char *value) {
+ return tac_add_attrib_pair(attr, name, '=', value);
+}
+
+int tac_add_attrib_pair(struct tac_attrib **attr, char *name, char sep, char *value) {
+ return _tac_add_attrib_pair(attr, name, sep, value, false);
+}
+
+int tac_add_attrib_truncate(struct tac_attrib **attr, char *name, char *value) {
+ return tac_add_attrib_pair_truncate(attr, name, '=', value);
+}
+
+int tac_add_attrib_pair_truncate(struct tac_attrib **attr, char *name, char sep, char *value) {
+ return _tac_add_attrib_pair(attr, name, sep, value, true);
+}
+
void tac_free_attrib(struct tac_attrib **attr) {
struct tac_attrib *a;
struct tac_attrib *b;
|