summaryrefslogtreecommitdiff
path: root/debian/patches/tac_add_attrib_truncate.patch
blob: ee64fff23403e9a18c3a8e3b548e63e8f1892469 (plain)
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;