2 Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
3 Ben Kibbey <bjk@luxsci.net>
5 This file is part of pwmd.
7 Pwmd is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 2 of the License, or
10 (at your option) any later version.
12 Pwmd is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with Pwmd. If not, see <http://www.gnu.org/licenses/>.
26 #include <sys/socket.h>
27 #include <sys/ioctl.h>
29 #ifdef HAVE_LINUX_SOCKIOS_H
30 #include <linux/sockios.h>
33 #include "pwmd-error.h"
35 #include "util-misc.h"
37 #include "util-string.h"
43 send_status (assuan_context_t ctx
, status_msg_t which
, const char *fmt
, ...)
45 const char *line
= NULL
;
46 char buf
[ASSUAN_LINELENGTH
+ 1];
47 const char *status
= NULL
;
50 struct client_s
*client
= ctx
? assuan_get_pointer (ctx
) : NULL
;
56 vsnprintf (buf
, sizeof (buf
), fmt
, ap
);
70 snprintf (buf
, sizeof (buf
), "%u", cache_file_count ());
75 MUTEX_LOCK (&cn_mutex
);
76 snprintf (buf
, sizeof (buf
), "%i", slist_length (cn_thread_list
));
78 MUTEX_UNLOCK (&cn_mutex
);
83 line
= _("Waiting for lock");
94 case STATUS_KEEPALIVE
:
98 p
= strchr (line
, ' ');
108 line
= line
+ strlen (status
) + 1;
115 log_write ("%s %s", status
, line
? line
: "");
120 if (client
&& client
->thd
->remote
&& which
== STATUS_KEEPALIVE
)
122 #ifdef HAVE_DECL_SIOCOUTQ
124 if (ioctl (client
->thd
->fd
, SIOCOUTQ
, &buffered
) == -1)
125 log_write ("%s(%i): ioctl: %s", __FUNCTION__
, __LINE__
,
126 pwmd_strerror (gpg_error_from_syserror ()));
129 int interval
= config_get_integer ("global", "keepalive_interval");
130 int timeout
= config_get_integer ("global", "tls_timeout");
132 if (++client
->thd
->buffer_timeout
* interval
>= timeout
)
133 rc
= gpg_error (GPG_ERR_ETIMEDOUT
);
140 rc
= assuan_write_status (ctx
, status
, line
);
142 if (which
!= STATUS_KEEPALIVE
)
143 client
->thd
->buffer_timeout
= 0;
149 send_status_all (status_msg_t s
, const char *fmt
, ...)
151 MUTEX_LOCK (&cn_mutex
);
153 int t
= slist_length (cn_thread_list
);
157 struct client_thread_s
*thd
= slist_nth_data (cn_thread_list
, i
);
158 struct status_msg_s
*msg
, *p
;
162 MUTEX_LOCK (&thd
->status_mutex
);
164 for (p
= thd
->msg_queue
; p
; p
= p
->next
)
175 MUTEX_UNLOCK (&thd
->status_mutex
);
179 msg
= xcalloc (1, sizeof (struct status_msg_s
));
186 str_vasprintf (&msg
->line
, fmt
, ap
);
190 for (p
= thd
->msg_queue
; p
&& p
->next
; p
= p
->next
);
192 thd
->msg_queue
= msg
;
196 write (thd
->status_msg_pipe
[1], &c
, 1);
197 MUTEX_UNLOCK (&thd
->status_mutex
);
200 MUTEX_UNLOCK (&cn_mutex
);