alarm.c revision dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0
1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdio.h>
2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h>
3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <fcntl.h>
4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h>
5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <errno.h>
6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <time.h>
7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <asm/ioctl.h>
8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project//#include <linux/rtc.h>
9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <linux/android_alarm.h>
10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint alarm_main(int argc, char *argv[])
12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	int c;
14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int res;
15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	struct tm tm;
16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	time_t t;
17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	struct timespec ts;
18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project//	struct rtc_time rtc_time;
19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	char strbuf[26];
20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	int afd;
21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	int nfd;
22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project//	struct timeval timeout = { 0, 0 };
23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int wait = 0;
24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	fd_set rfds;
25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	const char wake_lock_id[] = "alarm_test";
26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	int waitalarmmask = 0;
27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int useutc = 0;
29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	android_alarm_type_t alarmtype_low = ANDROID_ALARM_RTC_WAKEUP;
30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	android_alarm_type_t alarmtype_high = ANDROID_ALARM_RTC_WAKEUP;
31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	android_alarm_type_t alarmtype = 0;
32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    do {
34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        //c = getopt(argc, argv, "uw:");
35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        c = getopt(argc, argv, "uwat:");
36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (c == EOF)
37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            break;
38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        switch (c) {
39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        case 'u':
40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            useutc = 1;
41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            break;
42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		case 't':
43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			alarmtype_low = alarmtype_high = strtol(optarg, NULL, 0);
44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			break;
45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		case 'a':
46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			alarmtype_low = ANDROID_ALARM_RTC_WAKEUP;
47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			alarmtype_high = ANDROID_ALARM_TYPE_COUNT - 1;
48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			break;
49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        case 'w':
50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            //timeout.tv_sec = strtol(optarg, NULL, 0);
51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            wait = 1;
52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            break;
53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        case '?':
54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            fprintf(stderr, "%s: invalid option -%c\n",
55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                argv[0], optopt);
56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            exit(1);
57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    } while (1);
59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(optind + 2 < argc) {
60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        fprintf(stderr,"%s [-uwa] [-t type] [seconds]\n", argv[0]);
61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return 1;
62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    afd = open("/dev/alarm", O_RDWR);
65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(afd < 0) {
66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        fprintf(stderr, "Unable to open rtc: %s\n", strerror(errno));
67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return 1;
68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(optind == argc) {
71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		for(alarmtype = alarmtype_low; alarmtype <= alarmtype_high; alarmtype++) {
72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			waitalarmmask |= 1U << alarmtype;
73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		}
74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if 0
75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        res = ioctl(fd, RTC_ALM_READ, &tm);
76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if(res < 0) {
77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            fprintf(stderr, "Unable to read alarm: %s\n", strerror(errno));
78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			return 1;
79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif
81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if 0
82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		t = timegm(&tm);
83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if(useutc)
84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            gmtime_r(&t, &tm);
85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        else
86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            localtime_r(&t, &tm);
87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif
88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if 0
89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        asctime_r(&tm, strbuf);
90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        printf("%s", strbuf);
91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif
92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    else if(optind + 1 == argc) {
94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if 0
95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        res = ioctl(fd, RTC_RD_TIME, &tm);
96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if(res < 0) {
97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            fprintf(stderr, "Unable to set alarm: %s\n", strerror(errno));
98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			return 1;
99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        asctime_r(&tm, strbuf);
101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        printf("Now: %s", strbuf);
102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        time(&tv.tv_sec);
103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif
104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if 0
105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		time(&ts.tv_sec);
106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		ts.tv_nsec = 0;
107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        //strptime(argv[optind], NULL, &tm);
109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        //tv.tv_sec = mktime(&tm);
110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        //tv.tv_usec = 0;
111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif
112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		for(alarmtype = alarmtype_low; alarmtype <= alarmtype_high; alarmtype++) {
113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			waitalarmmask |= 1U << alarmtype;
114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		    res = ioctl(afd, ANDROID_ALARM_GET_TIME(alarmtype), &ts);
115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		    if(res < 0) {
116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		        fprintf(stderr, "Unable to get current time: %s\n", strerror(errno));
117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				return 1;
118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		    }
119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		    ts.tv_sec += strtol(argv[optind], NULL, 0);
120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		    //strtotimeval(argv[optind], &tv);
121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			gmtime_r(&ts.tv_sec, &tm);
122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		    printf("time %s -> %ld.%09ld\n", argv[optind], ts.tv_sec, ts.tv_nsec);
123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		    asctime_r(&tm, strbuf);
124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		    printf("Requested %s", strbuf);
125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		    res = ioctl(afd, ANDROID_ALARM_SET(alarmtype), &ts);
127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		    if(res < 0) {
128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		        fprintf(stderr, "Unable to set alarm: %s\n", strerror(errno));
129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				return 1;
130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		    }
131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		}
132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if 0
133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        res = ioctl(fd, RTC_ALM_SET, &tm);
134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if(res < 0) {
135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            fprintf(stderr, "Unable to set alarm: %s\n", strerror(errno));
136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			return 1;
137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        res = ioctl(fd, RTC_AIE_ON);
139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if(res < 0) {
140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            fprintf(stderr, "Unable to enable alarm: %s\n", strerror(errno));
141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			return 1;
142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif
144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    else {
146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        fprintf(stderr,"%s [-u] [date]\n", argv[0]);
147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return 1;
148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if(wait) {
151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		while(waitalarmmask) {
152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			printf("wait for alarm %x\n", waitalarmmask);
153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			res = ioctl(afd, ANDROID_ALARM_WAIT);
154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			if(res < 0) {
155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				fprintf(stderr, "alarm wait failed\n");
156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			}
157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			printf("got alarm %x\n", res);
158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			waitalarmmask &= ~res;
159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			nfd = open("/sys/android_power/acquire_full_wake_lock", O_RDWR);
160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			write(nfd, wake_lock_id, sizeof(wake_lock_id) - 1);
161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			close(nfd);
162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			//sleep(5);
163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			nfd = open("/sys/android_power/release_wake_lock", O_RDWR);
164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			write(nfd, wake_lock_id, sizeof(wake_lock_id) - 1);
165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			close(nfd);
166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		}
167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		printf("done\n");
168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if 0
170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	FD_ZERO(&rfds);
171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	FD_SET(fd, &rfds);
172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	res = select(fd + 1, &rfds, NULL, NULL, &timeout);
173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if(res < 0) {
174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        fprintf(stderr, "select failed: %s\n", strerror(errno));
175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		return 1;
176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if(res > 0) {
178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		int event;
179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		read(fd, &event, sizeof(event));
180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		fprintf(stderr, "got %x\n", event);
181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	else {
183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		fprintf(stderr, "timeout waiting for alarm\n");
184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif
186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    close(afd);
188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return 0;
190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
191