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