open("/dev/null", O_RDWR);
open("/dev/null", O_RDWR);
- chdir("/");
+ if (chdir("/")) {} /* Silence warn_unused_result warning */
(void) setsid();
euid = geteuid();
if (setreuid(euid, euid) < 0)
return c;
}
+static int write_all(int fd, char *buf, size_t count)
+{
+ ssize_t ret;
+ int c = 0;
+
+ while (count > 0) {
+ ret = write(fd, buf, count);
+ if (ret < 0) {
+ if ((errno == EAGAIN) || (errno == EINTR))
+ continue;
+ return -1;
+ }
+ count -= ret;
+ buf += ret;
+ c += ret;
+ }
+ return c;
+}
+
static const char *cleanup_pidfile, *cleanup_socket;
static void terminate_intr(int signo CODE_ATTR((unused)))
op_len += sizeof(int);
}
- ret = write(s, op_buf, op_len);
+ ret = write_all(s, op_buf, op_len);
if (ret < op_len) {
if (err_context)
*err_context = _("write");
int debug, int timeout, int quiet)
{
struct sockaddr_un my_addr, from_addr;
- unsigned char reply_buf[1024], *cp;
struct flock fl;
socklen_t fromlen;
int32_t reply_len = 0;
uuid_t uu;
mode_t save_umask;
+ char reply_buf[1024], *cp;
char op, str[37];
int i, s, ns, len, num;
int fd_pidfile, ret;
signal(SIGALRM, terminate_intr);
signal(SIGPIPE, SIG_IGN);
- sprintf(reply_buf, "%d\n", getpid());
- ftruncate(fd_pidfile, 0);
- write(fd_pidfile, reply_buf, strlen(reply_buf));
+ sprintf(reply_buf, "%8d\n", getpid());
+ if (ftruncate(fd_pidfile, 0)) {} /* Silence warn_unused_result */
+ write_all(fd_pidfile, reply_buf, strlen(reply_buf));
if (fd_pidfile > 1)
close(fd_pidfile); /* Unlock the pid file */
switch(op) {
case UUIDD_OP_GETPID:
- sprintf((char *) reply_buf, "%d", getpid());
- reply_len = strlen((char *) reply_buf)+1;
+ sprintf(reply_buf, "%d", getpid());
+ reply_len = strlen(reply_buf)+1;
break;
case UUIDD_OP_GET_MAXOP:
- sprintf((char *) reply_buf, "%d", UUIDD_MAX_OP);
- reply_len = strlen((char *) reply_buf)+1;
+ sprintf(reply_buf, "%d", UUIDD_MAX_OP);
+ reply_len = strlen(reply_buf)+1;
break;
case UUIDD_OP_TIME_UUID:
num = 1;
num = 1000;
if (num*16 > (int) (sizeof(reply_buf)-sizeof(num)))
num = (sizeof(reply_buf)-sizeof(num)) / 16;
- uuid__generate_random(reply_buf+sizeof(num), &num);
+ uuid__generate_random((unsigned char *) reply_buf +
+ sizeof(num), &num);
if (debug) {
printf(_("Generated %d UUID's:\n"), num);
for (i=0, cp=reply_buf+sizeof(num);
i < num; i++, cp+=16) {
- uuid_unparse(cp, str);
+ uuid_unparse((unsigned char *)cp, str);
printf("\t%s\n", str);
}
}
printf(_("Invalid operation %d\n"), op);
goto shutdown_socket;
}
- write(ns, &reply_len, sizeof(reply_len));
- write(ns, reply_buf, reply_len);
+ write_all(ns, (char *) &reply_len, sizeof(reply_len));
+ write_all(ns, reply_buf, reply_len);
shutdown_socket:
close(ns);
}
if (setregid(gid, gid) < 0)
die("setregid");
#endif
-
+
#ifdef HAVE_SETRESUID
if (setresuid(uid, uid, uid) < 0)
die("setresuid");