|
@@ -226,6 +226,43 @@ again:
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * alarm_setitimer - set alarm in seconds
|
|
|
+ *
|
|
|
+ * @seconds: number of seconds until alarm
|
|
|
+ * 0 disables the alarm
|
|
|
+ *
|
|
|
+ * Returns the remaining time in seconds of a pending timer or 0 when
|
|
|
+ * the timer is not active.
|
|
|
+ *
|
|
|
+ * On 32 bit machines the seconds value is limited to (INT_MAX/2) to avoid
|
|
|
+ * negative timeval settings which would cause immediate expiry.
|
|
|
+ */
|
|
|
+unsigned int alarm_setitimer(unsigned int seconds)
|
|
|
+{
|
|
|
+ struct itimerval it_new, it_old;
|
|
|
+
|
|
|
+#if BITS_PER_LONG < 64
|
|
|
+ if (seconds > INT_MAX)
|
|
|
+ seconds = INT_MAX;
|
|
|
+#endif
|
|
|
+ it_new.it_value.tv_sec = seconds;
|
|
|
+ it_new.it_value.tv_usec = 0;
|
|
|
+ it_new.it_interval.tv_sec = it_new.it_interval.tv_usec = 0;
|
|
|
+
|
|
|
+ do_setitimer(ITIMER_REAL, &it_new, &it_old);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * We can't return 0 if we have an alarm pending ... And we'd
|
|
|
+ * better return too much than too little anyway
|
|
|
+ */
|
|
|
+ if ((!it_old.it_value.tv_sec && it_old.it_value.tv_usec) ||
|
|
|
+ it_old.it_value.tv_usec >= 500000)
|
|
|
+ it_old.it_value.tv_sec++;
|
|
|
+
|
|
|
+ return it_old.it_value.tv_sec;
|
|
|
+}
|
|
|
+
|
|
|
asmlinkage long sys_setitimer(int which,
|
|
|
struct itimerval __user *value,
|
|
|
struct itimerval __user *ovalue)
|