cku2tm.c
上传用户:dufan58
上传日期:2007-01-05
资源大小:3407k
文件大小:5k
源码类别:

通讯/手机编程

开发平台:

Windows_Unix

  1. /*
  2.  * Steven Schultz - sms@moe.2bsd.com
  3.  *
  4.  * @(#)ctimed.c 1.0 (2.11BSD) 1996/6/25
  5.  *
  6.  * ctimed - the daemon that supports the ctime() and getpw*() stubs
  7.  *      in 'libcstubs.a'.
  8. */
  9. #include <signal.h>
  10. #include <stdio.h>
  11. #include <setjmp.h>
  12. #include <sys/ioctl.h>
  13. #include <sys/types.h>
  14. #include <sys/time.h>
  15. #include <pwd.h>
  16. #include <utmp.h>
  17. /*
  18.  * These should probably be placed in an include file.  If you add anything
  19.  * here then you will also have to modify /usr/src/usr.lib/libstubs/stubs.c
  20.  * (if for no other reason than to add the stub code).
  21. */
  22. #define CTIME 1
  23. #define ASCTIME 2
  24. #define TZSET 3
  25. #define LOCALTIME 4
  26. #define GMTIME 5
  27. #define OFFTIME 6
  28. #define GETPWENT 7
  29. #define GETPWNAM 8
  30. #define GETPWUID 9
  31. #define SETPASSENT 10
  32. #define ENDPWENT 11
  33. extern struct tm *offtime();
  34. jmp_buf env;
  35. char *cp;
  36. char junk[256 + sizeof (struct passwd) + 4];
  37. long off;
  38. time_t l;
  39. void timeout(), checkppid();
  40. struct tm tmtmp, *tp;
  41. main()
  42. {
  43. register int i;
  44. register struct passwd *pw;
  45. struct itimerval it;
  46. u_char c, xxx;
  47. int len, tosslen;
  48. uid_t uid;
  49. signal(SIGPIPE, SIG_DFL);
  50. for (i = getdtablesize(); --i > 2; )
  51. close(i);
  52. /*
  53.  * Need a timer running while we disassociate from the control terminal
  54.  * in case of a modem line which has lost carrier.
  55. */
  56. timerclear(&it.it_interval);
  57. it.it_value.tv_sec = 5;
  58. it.it_value.tv_usec = 0;
  59. signal(SIGALRM, timeout);
  60. setitimer(ITIMER_REAL, &it, (struct itimerval *) NULL);
  61. if (setjmp(env) == 0)
  62. {
  63. i = open("/dev/tty", 0);
  64. if (i >= 0)
  65. {
  66. ioctl(i, TIOCNOTTY, NULL);
  67. close(i);
  68. }
  69. }
  70. /*
  71.  * Now start a timer with one minute refresh.  In the signal service
  72.  * routine, check the parent process id to see if this process has
  73.  * been orphaned and if so exit.  This is primarily aimed at removing
  74.  * the 'ctimed' process left behind by 'sendmail's multi-fork startup
  75.  * but may prove useful in preventing accumulation of 'ctimed' processes
  76.  * in other circumstances as well.  Normally this process is short
  77.  * lived.
  78. */
  79. it.it_interval.tv_sec = 60;
  80. it.it_interval.tv_usec = 0;
  81. it.it_value.tv_sec = 60;
  82. it.it_value.tv_usec = 0;
  83. signal(SIGALRM, checkppid);
  84. setitimer(ITIMER_REAL, &it, (struct itimerval *) NULL);
  85. while (read(fileno(stdin), &c, 1) == 1)
  86. {
  87. switch (c)
  88. {
  89. case CTIME:
  90. l = 0L;
  91. getb(fileno(stdin), &l, sizeof l);
  92. cp = ctime(&l);
  93. write(fileno(stdout), cp, 26);
  94. break;
  95. case ASCTIME:
  96. getb(fileno(stdin), &tmtmp, sizeof tmtmp);
  97. cp = asctime(&tmtmp);
  98. write(fileno(stdout), cp, 26);
  99. break;
  100. case TZSET:
  101. (void) tzset();
  102. break;
  103. case LOCALTIME:
  104. l = 0L;
  105. getb(fileno(stdin), &l, sizeof l);
  106. tp = localtime(&l);
  107. write(fileno(stdout), tp, sizeof (*tp));
  108. strcpy(junk, tp->tm_zone);
  109. junk[24] = '';
  110. write(fileno(stdout), junk, 24);
  111. break;
  112. case GMTIME:
  113. l = 0L;
  114. getb(fileno(stdin), &l, sizeof l);
  115. tp = gmtime(&l);
  116. write(fileno(stdout), tp, sizeof (*tp));
  117. strcpy(junk, tp->tm_zone);
  118. junk[24] = '';
  119. write(fileno(stdout), junk, 24);
  120. break;
  121. case OFFTIME:
  122. getb(fileno(stdin), &l, sizeof l);
  123. getb(fileno(stdin), &off, sizeof off);
  124. #ifdef __bsdi__
  125. l += off;
  126. tp = localtime(&l);
  127. #else
  128. tp = offtime(&l, off);
  129. #endif
  130. write(fileno(stdout), tp, sizeof (*tp));
  131. break;
  132. case GETPWENT:
  133. pw = getpwent();
  134. do_pw(pw);
  135. break;
  136. case GETPWNAM:
  137. getb(fileno(stdin), &len, sizeof (int));
  138. if (len > UT_NAMESIZE)
  139. {
  140. tosslen = len - UT_NAMESIZE;
  141. len = UT_NAMESIZE;
  142. }
  143. else
  144. tosslen = 0;
  145. getb(fileno(stdin), junk, len);
  146. for (;tosslen; tosslen--)
  147. getb(fileno(stdin), &xxx, 1);
  148. junk[len] = '';
  149. pw = getpwnam(junk);
  150. do_pw(pw);
  151. break;
  152. case GETPWUID:
  153. getb(fileno(stdin), &uid, sizeof (uid_t));
  154. pw = getpwuid(uid);
  155. do_pw(pw);
  156. break;
  157. case SETPASSENT:
  158. getb(fileno(stdin), &len, sizeof (int));
  159. if (setpassent(len))
  160. len = 1;
  161. else
  162. len = 0;
  163. write(fileno(stdout), &len, sizeof (int));
  164. break;
  165. case ENDPWENT:
  166. endpwent();
  167. break;
  168. default:
  169. abort("switch");
  170. }
  171. }
  172. }
  173. getb(f, p, n)
  174. int f;
  175. register char *p;
  176. register int n;
  177. {
  178. register int i;
  179. while (n)
  180. {
  181. i = read(f, p, n);
  182. if (i <= 0)
  183. return;
  184. p += i;
  185. n -= i;
  186. }
  187. }
  188. void
  189. timeout()
  190. {
  191. longjmp(env, 1);
  192. }
  193. void
  194. checkppid()
  195. {
  196. if (getppid() == 1)
  197. exit(0);
  198. }
  199. do_pw(pw)
  200. struct passwd *pw;
  201. {
  202. int len;
  203. if (!pw)
  204. {
  205. len = 0;
  206. write(fileno(stdout), &len, sizeof (int));
  207. return;
  208. }
  209. len = packpwtobuf(pw, junk);
  210. write(fileno(stdout), &len, sizeof (int));
  211. write(fileno(stdout), pw, sizeof (*pw));
  212. write(fileno(stdout), junk, len);
  213. return;
  214. }
  215. packpwtobuf(pw, buf)
  216. register struct passwd *pw;
  217. char *buf;
  218. {
  219. register char *cp = buf;
  220. register char *dp;
  221. dp = pw->pw_name;
  222. pw->pw_name = (char*) 0;
  223. while (*cp++ = *dp++)
  224. ;
  225. dp = pw->pw_passwd;
  226. pw->pw_passwd = (char*) (cp - buf);
  227. while (*cp++ = *dp++)
  228. ;
  229. dp = pw->pw_class;
  230. pw->pw_class = (char*) (cp - buf);
  231. while (*cp++ = *dp++)
  232. ;
  233. dp = pw->pw_gecos;
  234. pw->pw_gecos = (char*) (cp - buf);
  235. while (*cp++ = *dp++)
  236. ;
  237. dp = pw->pw_dir;
  238. pw->pw_dir = (char*) (cp - buf);
  239. while (*cp++ = *dp++)
  240. ;
  241. dp = pw->pw_shell;
  242. pw->pw_shell = (char*) (cp - buf);
  243. while (*cp++ = *dp++)
  244. ;
  245. return(cp - buf);
  246. }