19f6915631b918a56e0e6be958fb14d274cbab322Mike Chan/* 29f6915631b918a56e0e6be958fb14d274cbab322Mike Chan * Copyright (C) 2010 The Android Open Source Project 39f6915631b918a56e0e6be958fb14d274cbab322Mike Chan * All rights reserved. 49f6915631b918a56e0e6be958fb14d274cbab322Mike Chan * 59f6915631b918a56e0e6be958fb14d274cbab322Mike Chan * Redistribution and use in source and binary forms, with or without 69f6915631b918a56e0e6be958fb14d274cbab322Mike Chan * modification, are permitted provided that the following conditions 79f6915631b918a56e0e6be958fb14d274cbab322Mike Chan * are met: 89f6915631b918a56e0e6be958fb14d274cbab322Mike Chan * * Redistributions of source code must retain the above copyright 99f6915631b918a56e0e6be958fb14d274cbab322Mike Chan * notice, this list of conditions and the following disclaimer. 109f6915631b918a56e0e6be958fb14d274cbab322Mike Chan * * Redistributions in binary form must reproduce the above copyright 119f6915631b918a56e0e6be958fb14d274cbab322Mike Chan * notice, this list of conditions and the following disclaimer in 129f6915631b918a56e0e6be958fb14d274cbab322Mike Chan * the documentation and/or other materials provided with the 139f6915631b918a56e0e6be958fb14d274cbab322Mike Chan * distribution. 149f6915631b918a56e0e6be958fb14d274cbab322Mike Chan * 159f6915631b918a56e0e6be958fb14d274cbab322Mike Chan * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 169f6915631b918a56e0e6be958fb14d274cbab322Mike Chan * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 179f6915631b918a56e0e6be958fb14d274cbab322Mike Chan * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 189f6915631b918a56e0e6be958fb14d274cbab322Mike Chan * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 199f6915631b918a56e0e6be958fb14d274cbab322Mike Chan * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 209f6915631b918a56e0e6be958fb14d274cbab322Mike Chan * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 219f6915631b918a56e0e6be958fb14d274cbab322Mike Chan * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 229f6915631b918a56e0e6be958fb14d274cbab322Mike Chan * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 239f6915631b918a56e0e6be958fb14d274cbab322Mike Chan * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 249f6915631b918a56e0e6be958fb14d274cbab322Mike Chan * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 259f6915631b918a56e0e6be958fb14d274cbab322Mike Chan * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 269f6915631b918a56e0e6be958fb14d274cbab322Mike Chan * SUCH DAMAGE. 279f6915631b918a56e0e6be958fb14d274cbab322Mike Chan */ 289f6915631b918a56e0e6be958fb14d274cbab322Mike Chan#include <unistd.h> 299f6915631b918a56e0e6be958fb14d274cbab322Mike Chan#include <stdio.h> 309f6915631b918a56e0e6be958fb14d274cbab322Mike Chan#include <errno.h> 319f6915631b918a56e0e6be958fb14d274cbab322Mike Chan#include <sys/stat.h> 3250ace4fec5e8cb5afcbc656a4556fa528adfd760David 'Digit' Turner#include "cpuacct.h" 33177ba8cb42ed6d232e7c8bcad5e6ee21fc51a0e8Rabin Vincent#include <fcntl.h> 349f6915631b918a56e0e6be958fb14d274cbab322Mike Chan 359f6915631b918a56e0e6be958fb14d274cbab322Mike Chanint cpuacct_add(uid_t uid) 369f6915631b918a56e0e6be958fb14d274cbab322Mike Chan{ 379f6915631b918a56e0e6be958fb14d274cbab322Mike Chan int count; 38177ba8cb42ed6d232e7c8bcad5e6ee21fc51a0e8Rabin Vincent int fd; 399f6915631b918a56e0e6be958fb14d274cbab322Mike Chan char buf[80]; 40177ba8cb42ed6d232e7c8bcad5e6ee21fc51a0e8Rabin Vincent ssize_t n; 41177ba8cb42ed6d232e7c8bcad5e6ee21fc51a0e8Rabin Vincent int ret = 0; 429f6915631b918a56e0e6be958fb14d274cbab322Mike Chan 439f6915631b918a56e0e6be958fb14d274cbab322Mike Chan count = snprintf(buf, sizeof(buf), "/acct/uid/%d/tasks", uid); 44177ba8cb42ed6d232e7c8bcad5e6ee21fc51a0e8Rabin Vincent fd = open(buf, O_RDWR | O_CREAT, 0666); 45177ba8cb42ed6d232e7c8bcad5e6ee21fc51a0e8Rabin Vincent if (fd == -1) { 469f6915631b918a56e0e6be958fb14d274cbab322Mike Chan /* Note: sizeof("tasks") returns 6, which includes the NULL char */ 479f6915631b918a56e0e6be958fb14d274cbab322Mike Chan buf[count - sizeof("tasks")] = 0; 489f6915631b918a56e0e6be958fb14d274cbab322Mike Chan if (mkdir(buf, 0775) < 0) 499f6915631b918a56e0e6be958fb14d274cbab322Mike Chan return -errno; 509f6915631b918a56e0e6be958fb14d274cbab322Mike Chan 519f6915631b918a56e0e6be958fb14d274cbab322Mike Chan /* Note: sizeof("tasks") returns 6, which includes the NULL char */ 529f6915631b918a56e0e6be958fb14d274cbab322Mike Chan buf[count - sizeof("tasks")] = '/'; 53177ba8cb42ed6d232e7c8bcad5e6ee21fc51a0e8Rabin Vincent fd = open(buf, O_RDWR | O_CREAT, 0666); 549f6915631b918a56e0e6be958fb14d274cbab322Mike Chan } 55177ba8cb42ed6d232e7c8bcad5e6ee21fc51a0e8Rabin Vincent if (fd == -1) 569f6915631b918a56e0e6be958fb14d274cbab322Mike Chan return -errno; 579f6915631b918a56e0e6be958fb14d274cbab322Mike Chan 58177ba8cb42ed6d232e7c8bcad5e6ee21fc51a0e8Rabin Vincent n = TEMP_FAILURE_RETRY(write(fd, "0", 1)); 59177ba8cb42ed6d232e7c8bcad5e6ee21fc51a0e8Rabin Vincent if (n < 0) 60177ba8cb42ed6d232e7c8bcad5e6ee21fc51a0e8Rabin Vincent ret = -errno; 61177ba8cb42ed6d232e7c8bcad5e6ee21fc51a0e8Rabin Vincent else if (n == 0) 62177ba8cb42ed6d232e7c8bcad5e6ee21fc51a0e8Rabin Vincent ret = -EIO; 63177ba8cb42ed6d232e7c8bcad5e6ee21fc51a0e8Rabin Vincent 64177ba8cb42ed6d232e7c8bcad5e6ee21fc51a0e8Rabin Vincent if (TEMP_FAILURE_RETRY(close(fd)) == -1) 659f6915631b918a56e0e6be958fb14d274cbab322Mike Chan return -errno; 669f6915631b918a56e0e6be958fb14d274cbab322Mike Chan 67177ba8cb42ed6d232e7c8bcad5e6ee21fc51a0e8Rabin Vincent return ret; 689f6915631b918a56e0e6be958fb14d274cbab322Mike Chan} 69