058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck/*
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck * Copyright (c) 2006 Sendmail, Inc. and its suppliers.
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck * All rights reserved.
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck *
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck * By using this file, you agree to the terms and conditions set
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck * forth in the LICENSE file which can be found at the top level of
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck * the sendmail distribution.
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck */
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck#pragma ident "%Z%%M% %I% %E% SMI"
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck#include <sm/gen.h>
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeckSM_IDSTR(id, "@(#)$Id: t-qic.c,v 1.9 2006/08/24 21:26:13 ca Exp $")
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck#include <stdio.h>
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck#include <sm/sendmail.h>
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck#include <sm/assert.h>
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck#include <sm/heap.h>
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck#include <sm/string.h>
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck#include <sm/test.h>
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeckextern bool SmTestVerbose;
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeckvoid
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeckshow_diff(s1, s2)
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck const char *s1;
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck const char *s2;
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck{
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck int i;
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck for (i = 0; s1[i] != '\0' && s2[i] != '\0'; i++)
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck {
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck if (s1[i] != s2[i])
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck {
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck fprintf(stderr, "i=%d, s1[]=%u, s2[]=%u\n",
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck i, (unsigned char) s1[i],
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck (unsigned char) s2[i]);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck return;
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck }
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck }
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck if (s1[i] != s2[i])
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck {
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck fprintf(stderr, "i=%d, s1[]=%u, s2[]=%u\n",
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck i, (unsigned char) s1[i], (unsigned char) s2[i]);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck }
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck}
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeckchar *quote_unquote __P((char *, char *, int, int));
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeckchar *
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeckquote_unquote(in, out, outlen, exp)
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck char *in;
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck char *out;
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck int outlen;
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck int exp;
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck{
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck char *obp, *bp;
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck char line_back[1024];
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck char line_in[1024];
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck int cmp;
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck sm_strlcpy(line_in, in, sizeof(line_in));
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck obp = quote_internal_chars(in, out, &outlen);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck bp = str2prt(line_in);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck dequote_internal_chars(obp, line_back, sizeof(line_back));
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck cmp = strcmp(line_in, line_back);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck SM_TEST(exp == cmp);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck if (cmp != exp && !SmTestVerbose)
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck {
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck fprintf(stderr, "in: %s\n", bp);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck bp = str2prt(line_back);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck fprintf(stderr, "out:%s\n", bp);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck fprintf(stderr, "cmp=%d\n", cmp);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck show_diff(in, line_back);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck }
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck if (SmTestVerbose)
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck {
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck fprintf(stderr, "%s -> ", bp);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck bp = str2prt(obp);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck fprintf(stderr, "%s\n", bp);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck fprintf(stderr, "cmp=%d\n", cmp);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck }
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck return obp;
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck}
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeckstruct sm_qic_S
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck{
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck char *qic_in;
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck char *qic_out;
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck int qic_exp;
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck};
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck
058561cbaa119a6f2659bc27ef343e1b47266bb2jbecktypedef struct sm_qic_S sm_qic_T;
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeckint
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeckmain(argc, argv)
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck int argc;
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck char *argv[];
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck{
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck char line_in[1024], line[256], line_out[32], *obp;
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck int i, los, cmp;
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck sm_qic_T inout[] = {
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck { "", "", 0 }
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck , { "abcdef", "abcdef", 0 }
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck , { "01234567890123456789", "01234567890123456789", 0 }
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck , { "01234567890123456789\001", "01234567890123456789\001",
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck 0 }
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck , { "012345\2067890123456789", "012345\377\2067890123456789",
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck 0 }
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck , { "\377", "\377\377", 0 }
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck , { "\240", "\240", 0 }
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck , { "\220", "\377\220", 0 }
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck , { "\240\220", "\240\377\220", 0 }
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck , { "\377\377", "\377\377\377\377", 0 }
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck , { "\377a\377b", "\377\377a\377\377b", 0 }
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck , { "\376a\377b", "\376a\377\377b", 0 }
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck , { "\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240",
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck "\377\200\377\201\377\202\377\203\377\204\377\205\377\206\377\207\377\210\377\211\377\212\377\213\377\214\377\215\377\216\377\217\377\220\377\221\377\222\377\223\377\224\377\225\377\226\377\227\377\230\377\231\377\232\377\233\377\234\377\235\377\236\377\237\240",
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck 0 }
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck , { NULL, NULL, 0 }
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck };
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck sm_test_begin(argc, argv, "test meta quoting");
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck for (i = 0; i < sizeof(line_out); i++)
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck line_out[i] = '\0';
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck for (i = 0; i < sizeof(line_in); i++)
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck line_in[i] = '\0';
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck for (i = 0; i < sizeof(line_in) / 2; i++)
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck {
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck char ch;
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck ch = 0200 + i;
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck if ('\0' == ch)
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck ch = '0';
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck line_in[i] = ch;
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck }
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck los = sizeof(line_out) / 2;
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck obp = quote_unquote(line_in, line_out, los, 0);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck if (obp != line_out)
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck SM_FREE(obp);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck for (i = 0; i < sizeof(line_in); i++)
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck line_in[i] = '\0';
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck for (i = 0; i < sizeof(line_in) / 2; i++)
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck {
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck char ch;
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck ch = 0200 + i;
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck if ('\0' == ch)
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck ch = '0';
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck line_in[i] = ch;
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck }
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck los = sizeof(line_in);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck obp = quote_unquote(line_in, line_in, los, 0);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck if (obp != line_in)
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck SM_FREE(obp);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck for (i = 0; inout[i].qic_in != NULL; i++)
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck {
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck los = sizeof(line_out) / 2;
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck obp = quote_unquote(inout[i].qic_in, line_out, los,
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck inout[i].qic_exp);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck cmp = strcmp(inout[i].qic_out, obp);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck SM_TEST(inout[i].qic_exp == cmp);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck if (inout[i].qic_exp != cmp && !SmTestVerbose)
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck {
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck char *bp;
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck bp = str2prt(obp);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck fprintf(stderr, "got: %s\n", bp);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck bp = str2prt(inout[i].qic_out);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck fprintf(stderr, "exp:%s\n", bp);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck fprintf(stderr, "cmp=%d\n", cmp);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck show_diff(inout[i].qic_in, inout[i].qic_out);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck }
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck if (obp != line_out)
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck SM_FREE(obp);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck }
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck /* use same buffer for in and out */
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck for (i = 0; inout[i].qic_in != NULL; i++)
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck {
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck bool same;
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck same = strcmp(inout[i].qic_in, inout[i].qic_out) == 0;
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck los = sm_strlcpy(line, inout[i].qic_in, sizeof(line));
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck SM_TEST(los + 1 < sizeof(line));
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck ++los;
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck obp = quote_unquote(line, line, los, inout[i].qic_exp);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck cmp = strcmp(inout[i].qic_out, obp);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck SM_TEST(inout[i].qic_exp == cmp);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck if (inout[i].qic_exp != cmp && !SmTestVerbose)
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck {
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck char *bp;
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck bp = str2prt(obp);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck fprintf(stderr, "got: %s\n", bp);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck bp = str2prt(inout[i].qic_out);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck fprintf(stderr, "exp:%s\n", bp);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck fprintf(stderr, "cmp=%d\n", cmp);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck show_diff(inout[i].qic_in, inout[i].qic_out);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck }
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck if (obp != line)
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck {
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck SM_TEST(!same);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck if (same)
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck show_diff(obp, inout[i].qic_out);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck SM_FREE(obp);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck }
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck }
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck /* use NULL buffer for out */
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck for (i = 0; inout[i].qic_in != NULL; i++)
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck {
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck los = 0;
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck obp = quote_unquote(inout[i].qic_in, NULL, los,
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck inout[i].qic_exp);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck SM_TEST(obp != NULL);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck cmp = strcmp(inout[i].qic_out, obp);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck SM_TEST(inout[i].qic_exp == cmp);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck if (inout[i].qic_exp != cmp && !SmTestVerbose)
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck {
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck char *bp;
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck bp = str2prt(obp);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck fprintf(stderr, "got: %s\n", bp);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck bp = str2prt(inout[i].qic_out);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck fprintf(stderr, "exp:%s\n", bp);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck fprintf(stderr, "cmp=%d\n", cmp);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck show_diff(inout[i].qic_in, inout[i].qic_out);
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck }
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck }
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck return sm_test_end();
058561cbaa119a6f2659bc27ef343e1b47266bb2jbeck}