110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/**
210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @file daemon/opd_pipe.c
310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * Functions handling the $SESSIONDIR/opd_pipe FIFO special file.
410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * NOTE: This code is dealing with potentially insecure input.
510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project *
610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @remark Copyright 2008 OProfile authors
710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @remark Read the file COPYING
810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project *
910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @author Daniel Hansel
1010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project */
1110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
1210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "opd_pipe.h"
1310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "opd_printf.h"
1410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_config.h"
1510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
1610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <stdio.h>
1710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <stdlib.h>
1810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <string.h>
1910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <fcntl.h>
2010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <unistd.h>
2110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <errno.h>
2210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <sys/stat.h>
2310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
2410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic int fifo;
255bbbe460405564a1aed8a67a13c43e9356ffc656Ben Chengstatic FILE * fifo_fd = NULL;
2610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
2710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectvoid opd_create_pipe(void)
2810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{
2910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	mode_t orig_umask = umask(0111);
3010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	if (mkfifo(op_pipe_file, 0666) == -1) {
3110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		if (errno != EEXIST) {
3210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			perror("oprofiled: couldn't create pipe: ");
3310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			exit(EXIT_FAILURE);
3410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		}
3510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	}
3610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	umask(orig_umask);
3710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project}
3810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
3910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
4010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectvoid opd_open_pipe(void)
4110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{
4210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	fifo = open(op_pipe_file, O_RDONLY | O_NONBLOCK);
4310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	if (fifo == -1) {
4410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		perror("oprofiled: couldn't open pipe: ");
4510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		exit(EXIT_FAILURE);
4610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	}
4710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project}
4810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
4910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
5010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectvoid opd_close_pipe(void)
5110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{
525bbbe460405564a1aed8a67a13c43e9356ffc656Ben Cheng	if (fifo_fd)
535bbbe460405564a1aed8a67a13c43e9356ffc656Ben Cheng		fclose(fifo_fd);
5410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	close(fifo);
5510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project}
5610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
5710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
5810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectint is_jitconv_requested(void)
5910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{
6010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	/* number of dropped (unknown) requests */
6110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	static long nr_drops = 0;
6210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	/* modulus to output only a few warnings to avoid flooding oprofiled.log */
6310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	static int mod_cnt_drops = 1;
6410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	char line[256];
6510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	int i, ret = 0;
6610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
6710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	/* get a file descriptor to the pipe */
685bbbe460405564a1aed8a67a13c43e9356ffc656Ben Cheng	if (!fifo_fd)
695bbbe460405564a1aed8a67a13c43e9356ffc656Ben Cheng		fifo_fd = fdopen(fifo, "r");
7010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
715bbbe460405564a1aed8a67a13c43e9356ffc656Ben Cheng	if (fifo_fd == NULL) {
7210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		perror("oprofiled: couldn't create file descriptor: ");
7310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		exit(EXIT_FAILURE);
7410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	}
7510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
7610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	/* read up to 99 lines to check for 'do_jitconv' */
7710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	for (i = 0; i < 99; i++) {
7810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		/* just break if no new line is found */
795bbbe460405564a1aed8a67a13c43e9356ffc656Ben Cheng		if (fgets(line, 256, fifo_fd) == NULL)
8010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			break;
8110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		line[strlen(line) - 1] = '\0';
8210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
8310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		if (strstr(line, "do_jitconv") != NULL) {
8410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			ret = 1;
8510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		} else {
8610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			nr_drops++;
8710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
8810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			if (nr_drops % mod_cnt_drops == 0) {
8910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project				printf(
9010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project				       "Warning: invalid pipe request received (dropped request(s): %ld)\n",
9110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project				       nr_drops);
9210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project				/* increase modulus to avoid flooding log file */
9310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project				mod_cnt_drops *= 5;
9410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			}
9510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		}
9610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	}
9710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
9810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	return ret;
9910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project}
100