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