qtaguid.c revision 9b5c774369fcbd4460751f9b01e692d688c386ba
18626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma/* libcutils/qtaguid.c
28626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma**
38626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma** Copyright 2011, The Android Open Source Project
48626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma**
58626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma** Licensed under the Apache License, Version 2.0 (the "License");
68626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma** you may not use this file except in compliance with the License.
78626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma** You may obtain a copy of the License at
88626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma**
98626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma**     http://www.apache.org/licenses/LICENSE-2.0
108626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma**
118626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma** Unless required by applicable law or agreed to in writing, software
128626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma** distributed under the License is distributed on an "AS IS" BASIS,
138626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
148626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma** See the License for the specific language governing permissions and
158626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma** limitations under the License.
168626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma*/
178626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma
188626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma#define LOG_TAG "qtaguid"
198626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma
208626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma#include <cutils/qtaguid.h>
218626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma#include <cutils/log.h>
229b5c774369fcbd4460751f9b01e692d688c386baAshish Sharma#include <errno.h>
238626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma#include <fcntl.h>
248626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma#include <stdio.h>
258626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma#include <string.h>
268626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma#include <unistd.h>
278626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma
289b5c774369fcbd4460751f9b01e692d688c386baAshish Sharmaextern int qtaguid_tagSocket(int sockfd, int tag, uid_t uid) {
298626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma    char lineBuf[128];
309b5c774369fcbd4460751f9b01e692d688c386baAshish Sharma    int fd, cnt = 0, res = 0;
318626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma    uint64_t kTag = (uint64_t)tag << 32;
328626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma    snprintf(lineBuf, sizeof(lineBuf), "t %d %llu %d", sockfd, kTag, uid);
338626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma
349b5c774369fcbd4460751f9b01e692d688c386baAshish Sharma    LOGI("Tagging socket %d with tag %llx(%d) for uid %d", sockfd, kTag, tag, uid);
359b5c774369fcbd4460751f9b01e692d688c386baAshish Sharma    fd = open("/proc/net/xt_qtaguid/ctrl", O_WRONLY);
369b5c774369fcbd4460751f9b01e692d688c386baAshish Sharma    if (fd < 0) {
379b5c774369fcbd4460751f9b01e692d688c386baAshish Sharma        return -errno;
389b5c774369fcbd4460751f9b01e692d688c386baAshish Sharma    }
399b5c774369fcbd4460751f9b01e692d688c386baAshish Sharma
409b5c774369fcbd4460751f9b01e692d688c386baAshish Sharma    cnt = write(fd, lineBuf, strlen(lineBuf));
419b5c774369fcbd4460751f9b01e692d688c386baAshish Sharma    if (cnt < 0) {
429b5c774369fcbd4460751f9b01e692d688c386baAshish Sharma        res = -errno;
439b5c774369fcbd4460751f9b01e692d688c386baAshish Sharma    }
449b5c774369fcbd4460751f9b01e692d688c386baAshish Sharma
459b5c774369fcbd4460751f9b01e692d688c386baAshish Sharma    close(fd);
469b5c774369fcbd4460751f9b01e692d688c386baAshish Sharma    return res;
479b5c774369fcbd4460751f9b01e692d688c386baAshish Sharma}
489b5c774369fcbd4460751f9b01e692d688c386baAshish Sharma
499b5c774369fcbd4460751f9b01e692d688c386baAshish Sharmaextern int qtaguid_untagSocket(int sockfd) {
509b5c774369fcbd4460751f9b01e692d688c386baAshish Sharma    char lineBuf[128];
519b5c774369fcbd4460751f9b01e692d688c386baAshish Sharma    int fd, cnt = 0, res = 0;
529b5c774369fcbd4460751f9b01e692d688c386baAshish Sharma    snprintf(lineBuf, sizeof(lineBuf), "u %d", sockfd);
539b5c774369fcbd4460751f9b01e692d688c386baAshish Sharma
549b5c774369fcbd4460751f9b01e692d688c386baAshish Sharma    LOGI("Untagging socket %d", sockfd);
559b5c774369fcbd4460751f9b01e692d688c386baAshish Sharma    fd = open("/proc/net/xt_qtaguid/ctrl", O_WRONLY);
569b5c774369fcbd4460751f9b01e692d688c386baAshish Sharma    if (fd < 0) {
579b5c774369fcbd4460751f9b01e692d688c386baAshish Sharma        return -errno;
589b5c774369fcbd4460751f9b01e692d688c386baAshish Sharma    }
599b5c774369fcbd4460751f9b01e692d688c386baAshish Sharma
609b5c774369fcbd4460751f9b01e692d688c386baAshish Sharma    cnt = write(fd, lineBuf, strlen(lineBuf));
619b5c774369fcbd4460751f9b01e692d688c386baAshish Sharma    if (cnt < 0) {
629b5c774369fcbd4460751f9b01e692d688c386baAshish Sharma        res = -errno;
639b5c774369fcbd4460751f9b01e692d688c386baAshish Sharma    }
649b5c774369fcbd4460751f9b01e692d688c386baAshish Sharma
659b5c774369fcbd4460751f9b01e692d688c386baAshish Sharma    close(fd);
669b5c774369fcbd4460751f9b01e692d688c386baAshish Sharma    return res;
678626cce5f381899f47e3a82e2ef4c98f183391b0Ashish Sharma}
68