xmalloc.c
author Sunil Nimmagadda <sunil@nimmagadda.net>
Tue, 06 Dec 2022 13:51:55 +0000
changeset 0 1d0ce1ebbc72
permissions -rw-r--r--
An HTTP(S), FTP client. Found a copy of some old OpenBSD days hacking stashed somewhere in the backups. This version saw the light of the day as official OpenBSD ftp(1) for a grand total of 1 day :-)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     1
/* $OpenBSD: xmalloc.c,v 1.11 2016/11/17 10:06:08 nicm Exp $ */
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     2
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     3
/*
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     4
 * Author: Tatu Ylonen <ylo@cs.hut.fi>
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     5
 * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     6
 *                    All rights reserved
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     7
 * Versions of malloc and friends that check their results, and never return
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     8
 * failure (they call fatalx if they encounter an error).
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     9
 *
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    10
 * As far as I am concerned, the code I have written for this software
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    11
 * can be used freely for any purpose.  Any derived versions of this
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    12
 * software must be clearly marked as such, and if the derived work is
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    13
 * incompatible with the protocol description in the RFC file, it must be
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    14
 * called by a name other than "ssh" or "Secure Shell".
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    15
 */
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    16
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    17
#include <err.h>
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    18
#include <errno.h>
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    19
#include <limits.h>
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    20
#include <stdarg.h>
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    21
#include <stdint.h>
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    22
#include <stdio.h>
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    23
#include <stdlib.h>
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    24
#include <string.h>
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    25
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    26
#include "xmalloc.h"
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    27
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    28
void *
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    29
xmalloc(size_t size)
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    30
{
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    31
	void *ptr;
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    32
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    33
	if (size == 0)
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    34
		errx(1, "xmalloc: zero size");
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    35
	ptr = malloc(size);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    36
	if (ptr == NULL)
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    37
		err(1, "xmalloc: allocating %zu bytes", size);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    38
	return ptr;
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    39
}
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    40
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    41
void *
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    42
xcalloc(size_t nmemb, size_t size)
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    43
{
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    44
	void *ptr;
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    45
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    46
	if (size == 0 || nmemb == 0)
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    47
		errx(1, "xcalloc: zero size");
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    48
	ptr = calloc(nmemb, size);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    49
	if (ptr == NULL)
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    50
		err(1, "xcalloc: allocating %zu * %zu bytes", nmemb, size);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    51
	return ptr;
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    52
}
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    53
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    54
void *
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    55
xrealloc(void *ptr, size_t size)
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    56
{
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    57
	return xreallocarray(ptr, 1, size);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    58
}
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    59
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    60
void *
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    61
xreallocarray(void *ptr, size_t nmemb, size_t size)
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    62
{
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    63
	void *new_ptr;
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    64
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    65
	if (nmemb == 0 || size == 0)
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    66
		errx(1, "xreallocarray: zero size");
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    67
	new_ptr = reallocarray(ptr, nmemb, size);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    68
	if (new_ptr == NULL)
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    69
		err(1, "xreallocarray: allocating %zu * %zu bytes",
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    70
		    nmemb, size);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    71
	return new_ptr;
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    72
}
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    73
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    74
char *
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    75
xstrdup(const char *str)
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    76
{
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    77
	char *cp;
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    78
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    79
	if ((cp = strdup(str)) == NULL)
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    80
		err(1, "xstrdup");
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    81
	return cp;
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    82
}
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    83
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    84
char *
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    85
xstrndup(const char *str, size_t maxlen)
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    86
{
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    87
	char *cp;
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    88
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    89
	if ((cp = strndup(str, maxlen)) == NULL)
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    90
		err(1, "xstrndup");
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    91
	return cp;
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    92
}
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    93
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    94
int
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    95
xasprintf(char **ret, const char *fmt, ...)
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    96
{
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    97
	va_list ap;
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    98
	int i;
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    99
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   100
	va_start(ap, fmt);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   101
	i = xvasprintf(ret, fmt, ap);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   102
	va_end(ap);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   103
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   104
	return i;
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   105
}
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   106
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   107
int
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   108
xvasprintf(char **ret, const char *fmt, va_list ap)
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   109
{
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   110
	int i;
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   111
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   112
	i = vasprintf(ret, fmt, ap);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   113
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   114
	if (i < 0 || *ret == NULL)
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   115
		err(1, "xasprintf");
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   116
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   117
	return i;
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   118
}
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   119
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   120
int
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   121
xsnprintf(char *str, size_t len, const char *fmt, ...)
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   122
{
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   123
	va_list ap;
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   124
	int i;
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   125
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   126
	va_start(ap, fmt);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   127
	i = xvsnprintf(str, len, fmt, ap);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   128
	va_end(ap);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   129
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   130
	return i;
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   131
}
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   132
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   133
int
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   134
xvsnprintf(char *str, size_t len, const char *fmt, va_list ap)
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   135
{
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   136
	int i;
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   137
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   138
	if (len > INT_MAX)
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   139
		errx(1, "xsnprintf: len > INT_MAX");
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   140
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   141
	i = vsnprintf(str, len, fmt, ap);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   142
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   143
	if (i < 0 || i >= (int)len)
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   144
		errx(1, "xsnprintf: overflow");
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   145
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   146
	return i;
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   147
}