source: openpam/trunk/lib/openpam_straddch.c @ 547

Last change on this file since 547 was 547, checked in by des, 2 years ago

Add an openpam_straddch() function that appends a character to a
string, reallocating the string if necessary.

Add an openpam_readword() function that reads a single word from a
file according to the usual shell quoting rules.

Add an openpam_readlinev() function that uses openpam_readword() to
read an entire line and return a list of the words it contained.

Rewrite openpam_parse_chain() using openpam_readlinev(), which greatly
simplifies the code and ensures correct parsing of module option.

Thanks to Maëlle Lesage for pointing out the issue and writing an
early version of what became the main loop in openpam_readword().

  • Property svn:keywords set to Id
File size: 3.4 KB
Line 
1/*-
2 * Copyright (c) 2012 Dag-Erling Smørgrav
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer
10 *    in this position and unchanged.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 * 3. The name of the author may not be used to endorse or promote
15 *    products derived from this software without specific prior written
16 *    permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 * SUCH DAMAGE.
29 *
30 * $Id$
31 */
32
33#ifdef HAVE_CONFIG_H
34# include "config.h"
35#endif
36
37#include <errno.h>
38#include <stdlib.h>
39
40#include <security/pam_appl.h>
41
42#include "openpam_impl.h"
43
44#define MIN_STR_SIZE    32
45
46/*
47 * OpenPAM extension
48 *
49 * Add a character to a string, expanding the buffer if needed.
50 */
51
52int
53openpam_straddch(char **str, size_t *size, size_t *len, int ch)
54{
55        size_t tmpsize;
56        char *tmpstr;
57
58        if (*str == NULL) {
59                /* initial allocation */
60                tmpsize = MIN_STR_SIZE;
61                if ((tmpstr = malloc(tmpsize)) == NULL) {
62                        openpam_log(PAM_LOG_ERROR, "malloc(): %m");
63                        errno = ENOMEM;
64                        return (-1);
65                }
66                *str = tmpstr;
67                *size = tmpsize;
68                *len = 0;
69        } else if (*len + 1 >= *size) {
70                /* additional space required */
71                tmpsize = *size * 2;
72                if ((tmpstr = realloc(*str, tmpsize)) == NULL) {
73                        openpam_log(PAM_LOG_ERROR, "realloc(): %m");
74                        errno = ENOMEM;
75                        return (-1);
76                }
77                *size = tmpsize;
78                *str = tmpstr;
79        }
80        (*str)[*len] = ch;
81        ++*len;
82        (*str)[*len] = '\0';
83        return (0);
84}
85
86/**
87 * The =openpam_straddch function appends a character to a dynamically
88 * allocated NUL-terminated buffer, reallocating the buffer as needed.
89 *
90 * The =str argument points to a variable containing either a pointer to
91 * an existing buffer or =NULL.
92 * If the value of the variable pointed to by =str is =NULL, a new buffer
93 * is allocated.
94 *
95 * The =size and =len argument point to variables used to hold the size
96 * of the buffer and the length of the string it contains, respectively.
97 *
98 * If a new buffer is allocated or an existing buffer is reallocated to
99 * make room for the additional character, =str and =size are updated
100 * accordingly.
101 *
102 * The =openpam_straddch function ensures that the buffer is always
103 * NUL-terminated.
104 *
105 * If the =openpam_straddch function is successful, it increments the
106 * integer variable pointed to by =len and returns 0.
107 * Otherwise, it leaves the variables pointed to by =str, =size and =len
108 * unmodified, sets :errno to =ENOMEM and returns -1.
109 */
Note: See TracBrowser for help on using the repository browser.