socketTag.cpp revision 73b89ae952174d04c34623ec40267829236dbcf9
173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall/*
273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * Copyright (C) 2011 The Android Open Source Project
373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall *
473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * Licensed under the Apache License, Version 2.0 (the "License");
573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * you may not use this file except in compliance with the License.
673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * You may obtain a copy of the License at
773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall *
873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall *      http://www.apache.org/licenses/LICENSE-2.0
973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall *
1073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * Unless requied by applicable law or agreed to in writing, software
1173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * distributed under the License is distributed on an "AS IS" BASIS,
1273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * See the License for the specific language governing permissions and
1473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * limitations under the License.
1573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall *
1673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall */
1773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall/*
1873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * This socket tagging test is to ensure that the
1973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * netfilter/xt_qtaguid kernel module somewhat behaves as expected
2073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * with respect to tagging sockets.
2173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall */
2273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <assert.h>
2373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <errno.h>
2473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <fcntl.h>
2573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <stdio.h>
2673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <stdlib.h>
2773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <sys/socket.h>
2873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <sys/types.h>
2973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <string>
3073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
3173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#define LOG_TAG "socketTagTest"
3273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <utils/Log.h>
3373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <testUtil.h>
3473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
3573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
3673b89ae952174d04c34623ec40267829236dbcf9JP Abgrallclass SockInfo {
3773b89ae952174d04c34623ec40267829236dbcf9JP Abgrallpublic:
3873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        SockInfo()
3973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall                : fd(-1), addr(NULL) {};
4073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        int setup(uint64_t tag);
4173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        bool checkTag(uint64_t tag, uid_t uid);
4273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        int fd;
4373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        void *addr;
4473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall};
4573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
4673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
4773b89ae952174d04c34623ec40267829236dbcf9JP Abgrallint openCtrl() {
4873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    int ctrl;
4973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    ctrl = open("/proc/net/xt_qtaguid/ctrl", O_RDWR);
5073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (!ctrl) {
5173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall       testPrintE("qtaguid ctrl open failed: %s", strerror(errno));
5273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
5373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    return ctrl;
5473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall}
5573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
5673b89ae952174d04c34623ec40267829236dbcf9JP Abgrallint doCtrlCommand(const char *fmt, ...) {
5773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    char *buff;
5873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    int ctrl;
5973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    int res;
6073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    va_list argp;
6173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
6273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    va_start(argp, fmt);
6373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    ctrl = openCtrl();
6473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    vasprintf(&buff, fmt, argp);
6573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    errno = 0;
6673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    res = write(ctrl, buff, strlen(buff));
6773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("cmd: '%s' res=%d %d/%s", buff, res, errno, strerror(errno));
6873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    close(ctrl);
6973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    free(buff);
7073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    va_end(argp);
7173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    return res;
7273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall}
7373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
7473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
7573b89ae952174d04c34623ec40267829236dbcf9JP Abgrallint writeModuleParam(const char *param, const char *data) {
7673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    int param_fd;
7773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    int res;
7873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    std::string filename("/sys/module/xt_qtaguid/parameters/");
7973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
8073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    filename += param;
8173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    param_fd = open(filename.c_str(), O_WRONLY);
8273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (param_fd < 0) {
8373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("qtaguid param open failed: %s", strerror(errno));
8473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        return -1;
8573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
8673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    res = write(param_fd, data, strlen(data));
8773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (res < 0) {
8873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("qtaguid param write failed: %s", strerror(errno));
8973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
9073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    close(param_fd);
9173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    return res;
9273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall}
9373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall/*----------------------------------------------------------------*/
9473b89ae952174d04c34623ec40267829236dbcf9JP Abgrallint SockInfo::setup(uint64_t tag) {
9573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    fd = socket(AF_INET, SOCK_STREAM, 0);
9673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (fd < 0) {
9773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("socket creation failed: %s", strerror(errno));
9873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        return -1;
9973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
10073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (doCtrlCommand("t %d %llu", fd, tag) < 0) {
10173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("socket setup: failed to tag");
10273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        close(fd);
10373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        return -1;
10473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
10573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (!checkTag(tag, getuid())) {
10673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("socket setup: Unexpected results: tag not found");
10773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        close(fd);
10873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        return -1;
10973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
11073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (doCtrlCommand("u %d", fd) < 0) {
11173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("socket setup: Unexpected results");
11273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        close(fd);
11373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        return -1;
11473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
11573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    return 0;
11673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall}
11773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
11873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall/* checkTag() also tries to lookup the socket address in the kernel and
11973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * return it when *addr  == NULL.
12073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * This allows for better look ups when another process is also setting the same
12173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * tag + uid. But it is not fool proof.
12273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * Without the kernel reporting more info on who setup the socket tag, it is
12373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * not easily verifiable from user-space.
12473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * Returns: true if tag found.
12573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall */
12673b89ae952174d04c34623ec40267829236dbcf9JP Abgrallbool SockInfo::checkTag(uint64_t acct_tag, uid_t uid) {
12773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    int ctrl_fd;
12873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    ctrl_fd = openCtrl();
12973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    char ctrl_data[1024];
13073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    ssize_t read_size;
13173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    char *buff;
13273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    char *pos;
13373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    int res;
13473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    char *match_template;
13573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    uint64_t k_tag;
13673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    uint32_t k_uid;
13773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    uint64_t full_tag;
13873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    long dummy_count;
13973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    pid_t dummy_pid;
14073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
14173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    read_size = read(ctrl_fd, ctrl_data, sizeof(ctrl_data));
14273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (read_size < 0) {
14373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall       testPrintE("Unable to read active tags from ctrl %d/%s",
14473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall                  errno, strerror(errno));
14573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
14673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    ctrl_data[read_size] = '\0';
14773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("<ctrl_raw_data>\n%s</ctrl_raw_data>", ctrl_data);
14873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
14973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (addr) {
15073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        assert(sizeof(void*) == sizeof(long int));  // Why does %p use 0x? grrr. %lx.
15173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        asprintf(&match_template, "sock=%lx %s", addr, "tag=0x%llx (uid=%u)");
15273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
15373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    else {
15473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        /* Allocate for symmetry */
15573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        asprintf(&match_template, "%s", " tag=0x%llx (uid=%u)");
15673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
15773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
15873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    full_tag = acct_tag | uid;
15973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
16073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    asprintf(&buff, match_template, full_tag | uid, uid);
16173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("looking for '%s'", buff);
16273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    pos = strstr(ctrl_data, buff);
16373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
16473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (pos && !addr) {
16573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        assert(sizeof(void*) == sizeof(long int));  // Why does %p use 0x? grrr. %lx.
16673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        res = sscanf(pos - strlen("sock=1234abcd"),
16773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall                     "sock=%lx tag=0x%llx (uid=%lu) pid=%u f_count=%lu",
16873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall                     &addr, &k_tag, &k_uid, &dummy_pid, &dummy_count );
16973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        if (!(res == 5 && k_tag == full_tag && k_uid == uid)) {
17073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall            testPrintE("Unable to read sock addr res=%d", res);
17173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall           addr = 0;
17273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        }
17373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        else {
17473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall            testPrintI("Got sock_addr %lx", addr);
17573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        }
17673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
17773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    free(buff);
17873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    free(match_template);
17973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    close(ctrl_fd);
18073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    return pos != NULL;
18173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall}
18273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
18373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall/*----------------------------------------------------------------*/
18473b89ae952174d04c34623ec40267829236dbcf9JP Abgrallint testSocketTagging(void) {
18573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    SockInfo sock0;
18673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    SockInfo sock1;
18773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    int res;
18873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    int total_errors = 0;
18973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    int ctrl_fd = -1;
19073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    int dev_fd = -1;
19173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    const uint64_t invalid_tag1 = 0x0000000100000001llu;
19273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    uint64_t valid_tag1;
19373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    uint64_t valid_tag2;
19473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    uint64_t max_uint_tag = 0xffffffff00000000llu;
19573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    uid_t fake_uid;
19673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    uid_t fake_uid2;
19773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    const char *test_name;
19873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    uid_t my_uid = getuid();
19973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    pid_t my_pid = getpid();
20073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
20173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    srand48(my_pid * my_uid);
20273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    /* Adjust fake UIDs and tags so that multiple instances can run in parallel. */
20373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    fake_uid = testRand();
20473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    fake_uid2 = testRand();
20573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    valid_tag1 = ((uint64_t)my_pid << 48) | ((uint64_t)testRand() << 32);
20673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    valid_tag2 = ((uint64_t)my_pid << 48) | ((uint64_t)testRand() << 32);
20773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    max_uint_tag = 1llu << 63 | (((uint64_t)my_pid << 48) ^ max_uint_tag);
20873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testSetLogCatTag(LOG_TAG);
20973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
21073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("** %s ** ============================", __FUNCTION__);
21173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("* start: pid=%lu uid=%lu uid1=0x%lx/%lu uid2=0x%lx/%lu"
21273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall               " tag1=0x%llx/%llu tag2=0x%llx/%llu",
21373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall               my_pid, my_uid, fake_uid, fake_uid, fake_uid2, fake_uid2,
21473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall               valid_tag1, valid_tag1, valid_tag2, valid_tag2);
21573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
21673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    // ---------------
21773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    test_name = "kernel has qtaguid";
21873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("* test: %s ", test_name);
21973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    ctrl_fd = openCtrl();
22073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (ctrl_fd < 0) {
22173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("qtaguid ctrl open failed: %s", strerror(errno));
22273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        total_errors++;
22373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        goto done;
22473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
22573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    close(ctrl_fd);
22673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    dev_fd = open("/dev/xt_qtaguid", O_RDONLY);
22773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (dev_fd < 0) {
22873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("qtaguid dev open failed: %s", strerror(errno));
22973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        total_errors++;
23073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
23173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    // ---------------
23273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    test_name = "delete command doesn't fail";
23373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("* test: %s", test_name);
23473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    res = doCtrlCommand("d 0 %u", fake_uid);
23573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (res < 0) {
23673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall            testPrintE("! %s: Unexpected results", test_name);
23773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall            total_errors++;
23873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
23973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
24073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    res = doCtrlCommand("d 0 %u", fake_uid2);
24173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (res < 0) {
24273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall            testPrintE("! %s: Unexpected results", test_name);
24373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall            total_errors++;
24473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
24573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
24673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    res = doCtrlCommand("d 0 %u", my_uid);
24773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (res < 0) {
24873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall            testPrintE("! %s: Unexpected results", test_name);
24973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall            total_errors++;
25073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
25173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    // ---------------
25273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    test_name = "setup sock0 and addr via tag";
25373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("* test: %s", test_name);
25473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (sock0.setup(valid_tag1) < 0) {
25573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("socket setup failed: %s", strerror(errno));
25673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        total_errors++;
25773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        goto done;
25873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
25973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
26073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    // ---------------
26173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    test_name = "setup sock1 and addr via tag";
26273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("* test: %s", test_name);
26373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (sock1.setup(valid_tag1) < 0) {
26473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("socket setup failed: %s", strerror(errno));
26573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        total_errors++;
26673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        goto done;
26773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
26873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    // ---------------
26973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    test_name = "insufficient args. Expected failure";
27073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("* test: %s", test_name);
27173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    res = doCtrlCommand("t");
27273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (res > 0) {
27373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("! %s: Unexpected results", test_name);
27473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        total_errors++;
27573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
27673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
27773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    // ---------------
27873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    test_name = "bad command. Expected failure";
27973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("* test: %s", test_name);
28073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    res = doCtrlCommand("?");
28173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (res > 0) {
28273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall            testPrintE("! %s: Unexpected results", test_name);
28373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        total_errors++;
28473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
28573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
28673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    // ---------------
28773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    test_name = "no tag, no uid";
28873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("* test: %s", test_name);
28973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    res = doCtrlCommand("t %d", sock0.fd);
29073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (res < 0) {
29173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("! %s: Unexpected results", test_name);
29273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        total_errors++;
29373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
29473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (!sock0.checkTag(0, my_uid)) {
29573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("! %s: Unexpected results: tag not found", test_name);
29673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        total_errors++;
29773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
29873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
29973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    // ---------------
30073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    test_name = "invalid tag. Expected failure";
30173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("* test: %s", test_name);
30273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    res = doCtrlCommand("t %d %llu", sock0.fd, invalid_tag1);
30373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (res > 0) {
30473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("! %s: Unexpected results", test_name);
30573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        total_errors++;
30673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
30773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (sock0.checkTag(invalid_tag1, my_uid)) {
30873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("! %s: Unexpected results: tag should not be there", test_name);
30973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        total_errors++;
31073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
31173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
31273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    // ---------------
31373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    test_name = "valid tag with no uid";
31473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("* test: %s", test_name);
31573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    res = doCtrlCommand("t %d %llu", sock0.fd, valid_tag1);
31673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (res < 0) {
31773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("! %s: Unexpected results", test_name);
31873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        total_errors++;
31973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
32073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (!sock0.checkTag(valid_tag1, my_uid)) {
32173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("! %s: Unexpected results: tag not found", test_name);
32273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        total_errors++;
32373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
32473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    // ---------------
32573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    test_name = "valid untag";
32673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("* test: %s", test_name);
32773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    res = doCtrlCommand("u %d", sock0.fd);
32873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (res < 0) {
32973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("! %s: Unexpected results", test_name);
33073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        total_errors++;
33173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
33273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (sock0.checkTag(valid_tag1, my_uid)) {
33373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("! %s: Unexpected results: tag not removed", test_name);
33473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        total_errors++;
33573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
33673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
33773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    // ---------------
33873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    test_name = "valid 1st tag";
33973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("* test: %s", test_name);
34073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    res = doCtrlCommand("t %d %llu %u", sock0.fd, valid_tag2, fake_uid);
34173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (res < 0) {
34273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("! %s: Unexpected results", test_name);
34373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        total_errors++;
34473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
34573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (!sock0.checkTag(valid_tag2, fake_uid)) {
34673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("! %s: Unexpected results: tag not found", test_name);
34773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        total_errors++;
34873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
34973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
35073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    // ---------------
35173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    test_name = "valid re-tag";
35273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("* test: %s", test_name);
35373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    res = doCtrlCommand("t %d %llu %u", sock0.fd, valid_tag2, fake_uid);
35473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (res < 0) {
35573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("! %s: Unexpected results", test_name);
35673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        total_errors++;
35773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
35873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (!sock0.checkTag(valid_tag2, fake_uid)) {
35973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("! %s: Unexpected results: tag not found", test_name);
36073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        total_errors++;
36173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
36273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
36373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    // ---------------
36473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    test_name = "valid re-tag with acct_tag change";
36573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("* test: %s", test_name);
36673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    res = doCtrlCommand("t %d %llu %u", sock0.fd, valid_tag1, fake_uid);
36773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (res < 0) {
36873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("! %s: Unexpected results", test_name);
36973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        total_errors++;
37073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
37173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (!sock0.checkTag(valid_tag1, fake_uid)) {
37273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("! %s: Unexpected results: tag not found", test_name);
37373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        total_errors++;
37473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
37573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
37673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    // ---------------
37773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    test_name = "re-tag with uid change";
37873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("* test: %s", test_name);
37973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    res = doCtrlCommand("t %d %llu %u", sock0.fd, valid_tag2, fake_uid2);
38073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (res < 0) {
38173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("! %s: Unexpected results", test_name);
38273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        total_errors++;
38373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
38473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (!sock0.checkTag(valid_tag2, fake_uid2)) {
38573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("! %s: Unexpected results: tag not found", test_name);
38673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        total_errors++;
38773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
38873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
38973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    // ---------------
39073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    test_name = "valid 64bit acct tag";
39173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("* test: %s", test_name);
39273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    res = doCtrlCommand("t %d %llu", sock0.fd, max_uint_tag);
39373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (res < 0) {
39473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("! %s: Unexpected results", test_name);
39573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        total_errors++;
39673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
39773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (!sock0.checkTag(max_uint_tag, my_uid)) {
39873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("! %s: Unexpected results: tag not found", test_name);
39973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        total_errors++;
40073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
40173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
40273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    // ---------------
40373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    test_name = "tag another socket";
40473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("* test: %s", test_name);
40573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    res = doCtrlCommand("t %d %llu %u", sock1.fd, valid_tag1, fake_uid2);
40673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (res < 0) {
40773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("! %s: Unexpected results", test_name);
40873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        total_errors++;
40973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
41073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (!sock1.checkTag(valid_tag1, fake_uid2)) {
41173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("! %s: Unexpected results: tag not found", test_name);
41273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        total_errors++;
41373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
41473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
41573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    // ---------------
41673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    test_name = "valid untag";
41773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("* test: %s", test_name);
41873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    res = doCtrlCommand("u %d", sock0.fd);
41973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (res < 0) {
42073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("! %s: Unexpected results", test_name);
42173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        total_errors++;
42273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
42373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (sock0.checkTag(max_uint_tag, fake_uid)) {
42473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("! %s: Unexpected results: tag should not be there", test_name);
42573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        total_errors++;
42673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
42773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (!sock1.checkTag(valid_tag1, fake_uid2)) {
42873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("! %s: Unexpected results: tag not found", test_name);
42973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        total_errors++;
43073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
43173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    res = doCtrlCommand("u %d", sock1.fd);
43273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (res < 0) {
43373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("! %s: Unexpected results", test_name);
43473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        total_errors++;
43573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
43673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (sock1.checkTag(valid_tag1, fake_uid2)) {
43773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("! %s: Unexpected results: tag should not be there", test_name);
43873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        total_errors++;
43973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
44073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
44173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    // ---------------
44273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    test_name = "invalid sock0.fd. Expected failure";
44373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("* test: %s", test_name);
44473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    close(sock0.fd);
44573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    res = doCtrlCommand("t %d %llu %u", sock0.fd, valid_tag1, my_uid);
44673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (res > 0) {
44773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall            testPrintE("! %s: Unexpected results", test_name);
44873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        total_errors++;
44973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
45073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (sock0.checkTag(valid_tag1, my_uid)) {
45173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("! %s: Unexpected results: tag should not be there", test_name);
45273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        total_errors++;
45373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
45473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
45573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    // ---------------
45673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    test_name = "invalid untag. Expected failure";
45773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("* test: %s", test_name);
45873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    close(sock1.fd);
45973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    res = doCtrlCommand("u %d", sock1.fd);
46073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (res > 0) {
46173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("! %s: Unexpected results", test_name);
46273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        total_errors++;
46373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
46473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
46573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (total_errors) {
46673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("! Errors found");
46773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    } else {
46873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintI("No Errors found");
46973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
47073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
47173b89ae952174d04c34623ec40267829236dbcf9JP Abgralldone:
47273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (dev_fd >= 0) {
47373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        close(dev_fd);
47473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
47573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (ctrl_fd >= 0) {
47673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        close(ctrl_fd);
47773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
47873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    return total_errors;
47973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall}
48073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
48173b89ae952174d04c34623ec40267829236dbcf9JP Abgrallint testTagData(void) {
48273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    SockInfo sock0;
48373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    SockInfo sock1;
48473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    int res;
48573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    int total_errors = 0;
48673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    int ctrl_fd = -1;
48773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    int dev_fd = -1;
48873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    const uint64_t invalid_tag1 = 0x0000000100000001llu;
48973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    uint64_t valid_tag1;
49073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    uint64_t valid_tag2;
49173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    uint64_t max_uint_tag = 0xffffffff00000000llu;
49273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    uid_t fake_uid;
49373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    uid_t fake_uid2;
49473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    const char *test_name;
49573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    uid_t my_uid = getuid();
49673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    pid_t my_pid = getpid();
49773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    const int max_tags = 5;
49873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
49973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    srand48(my_pid * my_uid);
50073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    /* Adjust fake UIDs and tags so that multiple instances can run in parallel. */
50173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    fake_uid = testRand();
50273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    fake_uid2 = testRand();
50373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    valid_tag1 = ((uint64_t)my_pid << 48) | ((uint64_t)testRand() << 32);
50473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    valid_tag2 = ((uint64_t)my_pid << 48) | ((uint64_t)testRand() << 32);
50573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    valid_tag2 &= 0xffffff00ffffffffllu;  // Leave some room to make counts visible.
50673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testSetLogCatTag(LOG_TAG);
50773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
50873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("** %s ** ============================", __FUNCTION__);
50973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("* start: pid=%lu uid=%lu uid1=0x%lx/%lu uid2=0x%lx/%lu"
51073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall               " tag1=0x%llx/%llu tag2=0x%llx/%llu",
51173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall               my_pid, my_uid, fake_uid, fake_uid, fake_uid2, fake_uid2,
51273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall               valid_tag1, valid_tag1, valid_tag2, valid_tag2);
51373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
51473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    // ---------------
51573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    test_name = "kernel has qtaguid";
51673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("* test: %s ", test_name);
51773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    ctrl_fd = openCtrl();
51873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (ctrl_fd < 0) {
51973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("qtaguid ctrl open failed: %s", strerror(errno));
52073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        return 1;
52173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
52273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    close(ctrl_fd);
52373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    dev_fd = open("/dev/xt_qtaguid", O_RDONLY);
52473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (dev_fd < 0) {
52573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("! %s: qtaguid dev open failed: %s", test_name, strerror(errno));
52673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        total_errors++;
52773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
52873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    // ---------------
52973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    test_name = "delete command doesn't fail";
53073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("* test: %s", test_name);
53173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    res = doCtrlCommand("d 0 %u", fake_uid);
53273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (res < 0) {
53373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall            testPrintE("! %s: Unexpected results", test_name);
53473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall            total_errors++;
53573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
53673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
53773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    res = doCtrlCommand("d 0 %u", fake_uid2);
53873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (res < 0) {
53973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall            testPrintE("! %s: Unexpected results", test_name);
54073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall            total_errors++;
54173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
54273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
54373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    res = doCtrlCommand("d 0 %u", my_uid);
54473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (res < 0) {
54573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall            testPrintE("! %s: Unexpected results", test_name);
54673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall            total_errors++;
54773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
54873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
54973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    // ---------------
55073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    test_name = "setup sock0 and addr via tag";
55173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("* test: %s", test_name);
55273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (sock0.setup(valid_tag1)) {
55373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("socket setup failed: %s", strerror(errno));
55473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        return 1;
55573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
55673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    // ---------------
55773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    test_name = "setup sock1 and addr via tag";
55873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("* test: %s", test_name);
55973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (sock1.setup(valid_tag1)) {
56073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("socket setup failed: %s", strerror(errno));
56173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        return 1;
56273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
56373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    // ---------------
56473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    test_name = "setup tag limit";
56573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("* test: %s ", test_name);
56673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    char *max_tags_str;
56773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    asprintf(&max_tags_str, "%d", max_tags);
56873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    res = writeModuleParam("max_sock_tags", max_tags_str);
56973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (res < 0) {
57073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("! %s: Unexpected results", test_name);
57173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        free(max_tags_str);
57273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        return 1;
57373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
57473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
57573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    // ---------------
57673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    test_name = "tag quota reach limit";
57773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("* test: %s", test_name);
57873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    for (int cnt = 0; cnt < max_tags; cnt++ ) {
57973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        uint64_t new_tag = valid_tag2 + ((uint64_t)cnt << 32);
58073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        res = doCtrlCommand("t %d %llu %u", sock0.fd, new_tag , fake_uid2);
58173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        if (res < 0) {
58273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall                testPrintE("! %s: Unexpected results", test_name);
58373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall                total_errors++;
58473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        }
58573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        if (!sock0.checkTag(new_tag, fake_uid2)) {
58673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall                testPrintE("! %s: Unexpected results: tag not found", test_name);
58773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall                total_errors++;
58873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        }
58973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
59073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    test_name = "tag quota go over limit";
59173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("* test: %s", test_name);
59273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    {
59373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        uint64_t new_tag = valid_tag2 + ((uint64_t)max_tags << 32);
59473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        res = doCtrlCommand("t %d %llu %u", sock0.fd, new_tag , fake_uid2);
59573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        if (res > 0) {
59673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall                testPrintE("! %s: Unexpected results", test_name);
59773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall                total_errors++;
59873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        }
59973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        if (!sock0.checkTag(valid_tag2 + (((uint64_t)max_tags - 1) << 32), fake_uid2)) {
60073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall                testPrintE("! %s: Unexpected results: tag not found", test_name);
60173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall                total_errors++;
60273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        }
60373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
60473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
60573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    // ---------------
60673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    test_name = "valid untag";
60773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("* test: %s", test_name);
60873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    res = doCtrlCommand("u %d", sock0.fd);
60973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (res < 0) {
61073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("! %s: Unexpected results", test_name);
61173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        total_errors++;
61273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
61373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (sock0.checkTag(valid_tag2 + (((uint64_t)max_tags - 1) << 32), fake_uid2)) {
61473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("! %s: Unexpected results: tag should not be there", test_name);
61573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        total_errors++;
61673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
61773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
61873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    // ---------------
61973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    test_name = "tag after untag shouldn't free up max tags";
62073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("* test: %s", test_name);
62173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    {
62273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        uint64_t new_tag = valid_tag2 + ((uint64_t)max_tags << 32);
62373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        res = doCtrlCommand("t %d %llu %u", sock0.fd, new_tag , fake_uid2);
62473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        if (res > 0) {
62573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall                testPrintE("! %s: Unexpected results", test_name);
62673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall                total_errors++;
62773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        }
62873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        if (sock0.checkTag(valid_tag2 + ((uint64_t)max_tags << 32), fake_uid2)) {
62973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall            testPrintE("! %s: Unexpected results: tag should not be there", test_name);
63073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall            total_errors++;
63173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        }
63273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
63373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
63473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    // ---------------
63573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    test_name = "delete one tag";
63673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("* test: %s", test_name);
63773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    {
63873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall            uint64_t new_tag = valid_tag2 + (((uint64_t)max_tags / 2) << 32);
63973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall            res = doCtrlCommand("d %llu %u", new_tag, fake_uid2);
64073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall            if (res < 0) {
64173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall                    testPrintE("! %s: Unexpected results", test_name);
64273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall                    total_errors++;
64373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall            }
64473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
64573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
64673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    // ---------------
64773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    test_name = "2 tags after 1 delete pass/fail";
64873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("* test: %s", test_name);
64973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    {
65073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        uint64_t new_tag;
65173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        new_tag = valid_tag2 + (((uint64_t)max_tags + 1 ) << 32);
65273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        res = doCtrlCommand("t %d %llu %u", sock0.fd, new_tag , fake_uid2);
65373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        if (res < 0) {
65473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall                testPrintE("! %s: Unexpected results", test_name);
65573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall                total_errors++;
65673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        }
65773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        if (!sock0.checkTag(valid_tag2 + (((uint64_t)max_tags + 1) << 32), fake_uid2)) {
65873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall            testPrintE("! %s: Unexpected results: tag not found", test_name);
65973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall            total_errors++;
66073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        }
66173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
66273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        new_tag = valid_tag2 + (((uint64_t)max_tags + 2 ) << 32);
66373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        res = doCtrlCommand("t %d %llu %u", sock0.fd, new_tag , fake_uid2);
66473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        if (res > 0) {
66573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall                testPrintE("! %s: Unexpected results", test_name);
66673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall                total_errors++;
66773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        }
66873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        if (sock0.checkTag(valid_tag2 + (((uint64_t)max_tags + 2) << 32), fake_uid2)) {
66973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall            testPrintE("! %s: Unexpected results: tag should not be there", test_name);
67073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall            total_errors++;
67173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        }
67273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
67373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
67473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    /* TODO(jpa): test tagging two different sockets with same tags and
67573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall     * check refcounts  the tag_node should be +2
67673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall     */
67773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
67873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    // ---------------
67973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (total_errors) {
68073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("! Errors found");
68173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    } else {
68273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintI("No Errors found");
68373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
68473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
68573b89ae952174d04c34623ec40267829236dbcf9JP Abgralldone:
68673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (dev_fd >= 0) {
68773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        close(dev_fd);
68873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
68973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (ctrl_fd >= 0) {
69073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        close(ctrl_fd);
69173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
69273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    return total_errors;
69373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall}
69473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
69573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall/*----------------------------------------------------------------*/
69673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
69773b89ae952174d04c34623ec40267829236dbcf9JP Abgrallint main(int argc, char *argv[]) {
69873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    int res = 0;
69973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    res += testTagData();
70073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    res += testSocketTagging();
70173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (res) {
70273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("!! %d Errors found", res);
70373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    } else {
70473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("No Errors found");
70573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
70673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    return res;
70773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall}
708