/*
 * Copyright (c) 2008, The Android Open Source Project
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *  * Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  * Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the 
 *    distribution.
 *  * Neither the name of Google, Inc. nor the names of its contributors
 *    may be used to endorse or promote products derived from this
 *    software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sched.h>

static void
usage(const char *s)
{
    fprintf(stderr, "USAGE: %s [[-r] priority pids ...] [-g pid]\n", s);
    exit(EXIT_FAILURE);
}

void print_prio(pid_t pid)
{
    int sched;
    struct sched_param sp;

    printf("pid %d's priority: %d\n", pid, getpriority(PRIO_PROCESS, pid));

    printf("scheduling class: ");
    sched = sched_getscheduler(pid);
    switch (sched) {
    case SCHED_FIFO:
        printf("FIFO\n");
        break;
    case SCHED_RR:
        printf("RR\n");
        break;
    case SCHED_OTHER:
        printf("Normal\n");
        break;
    case -1:
        perror("sched_getscheduler");
        break;
    default:
        printf("Unknown\n");
    }

    sched_getparam(pid, &sp);
    printf("RT prio: %d (of %d to %d)\n", sp.sched_priority,
           sched_get_priority_min(sched), sched_get_priority_max(sched));
}

int renice_main(int argc, char *argv[])
{
    int prio;
    int realtime = 0;
    char *cmd = argv[0];

    // consume command name
    argc--;
    argv++;

    if (argc < 1)
        usage(cmd);

    if(strcmp("-r", argv[0]) == 0) {
        // do realtime priority adjustment
        realtime = 1;
        argc--;
        argv++;
    }

	if(strcmp("-g", argv[0]) == 0) {
        if (argc < 2)
            usage(cmd);
        print_prio(atoi(argv[1]));
        return 0;
    }

    if (argc < 1)
        usage(cmd);

    prio = atoi(argv[0]);
    argc--;
    argv++;

    if (argc < 1)
        usage(cmd);

    while(argc) {
        pid_t pid;

        pid = atoi(argv[0]);
        argc--;
        argv++;

        if (realtime) {
            struct sched_param sp = { .sched_priority = prio };
            int ret;

            ret = sched_setscheduler(pid, SCHED_RR, &sp);
            if (ret) {
                perror("sched_set_scheduler");
                exit(EXIT_FAILURE);
            }
        } else {
            int ret;

            ret = setpriority(PRIO_PROCESS, pid, prio);
            if (ret) {
                perror("setpriority");
                exit(EXIT_FAILURE);
            }
        }
    }
   
    return 0;
}


