diff --git a/include/cutils/qtaguid.h b/include/cutils/qtaguid.h index 8aa34ea35..e6d61e639 100644 --- a/include/cutils/qtaguid.h +++ b/include/cutils/qtaguid.h @@ -28,7 +28,12 @@ extern "C" { /* * Set tags (and owning UIDs) for network sockets. */ -extern int set_qtaguid(int sockfd, int tag, uid_t uid); +extern int qtaguid_tagSocket(int sockfd, int tag, uid_t uid); + +/* + * Untag a network socket before closing. +*/ +extern int qtaguid_untagSocket(int sockfd); #ifdef __cplusplus } diff --git a/libcutils/qtaguid.c b/libcutils/qtaguid.c index 517e78422..218a21f13 100644 --- a/libcutils/qtaguid.c +++ b/libcutils/qtaguid.c @@ -19,26 +19,49 @@ #include #include +#include #include #include #include #include -extern int set_qtaguid(int sockfd, int tag, uid_t uid) { +extern int qtaguid_tagSocket(int sockfd, int tag, uid_t uid) { char lineBuf[128]; - int fd, cnt = 0; + int fd, cnt = 0, res = 0; uint64_t kTag = (uint64_t)tag << 32; snprintf(lineBuf, sizeof(lineBuf), "t %d %llu %d", sockfd, kTag, uid); - LOGV("Tagging Socket with command %s\n", lineBuf); - /* TODO: Enable after the kernel module is fixed. - fd = open("/proc/net/xt_qtaguid/ctrl", O_WRONLY); - if (fd < 0) { - return -1; - } + LOGI("Tagging socket %d with tag %llx(%d) for uid %d", sockfd, kTag, tag, uid); + fd = open("/proc/net/xt_qtaguid/ctrl", O_WRONLY); + if (fd < 0) { + return -errno; + } - cnt = write(fd, lineBuf, strlen(lineBuf)); - close(fd); - */ - return (cnt>0?0:-1); + cnt = write(fd, lineBuf, strlen(lineBuf)); + if (cnt < 0) { + res = -errno; + } + + close(fd); + return res; +} + +extern int qtaguid_untagSocket(int sockfd) { + char lineBuf[128]; + int fd, cnt = 0, res = 0; + snprintf(lineBuf, sizeof(lineBuf), "u %d", sockfd); + + LOGI("Untagging socket %d", sockfd); + fd = open("/proc/net/xt_qtaguid/ctrl", O_WRONLY); + if (fd < 0) { + return -errno; + } + + cnt = write(fd, lineBuf, strlen(lineBuf)); + if (cnt < 0) { + res = -errno; + } + + close(fd); + return res; }