home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume6 / renice.sco / part02 < prev    next >
Internet Message Format  |  1989-02-08  |  12KB

  1. Path: lll-winken!ames!mailrus!tut.cis.ohio-state.edu!ucbvax!unisoft!uunet!allbery
  2. From: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  3. Newsgroups: comp.sources.misc
  4. Subject: v06i033: SCO Xenix 286 renice part2/2
  5. Message-ID: <48162@uunet.UU.NET>
  6. Date: 4 Feb 89 03:13:23 GMT
  7. Sender: allbery@uunet.UU.NET
  8. Reply-To: wht@tridom.UUCP (Warren Tucker)
  9. Lines: 459
  10. Approved: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  11.  
  12. Posting-number: Volume 6, Issue 33
  13. Submitted-by: wht@tridom.UUCP (Warren Tucker)
  14. Archive-name: renice.sco/part02
  15.  
  16. More (re)niceness.
  17.  
  18. #!/bin/sh
  19. # shar:    Shell Archiver  (v1.22)
  20. #
  21. #    Run the following text with /bin/sh to create:
  22. #      libkmem.c
  23. #      libuxlst.c
  24. #      uxlst.c
  25. #      renice.c
  26. #
  27. if test -f libkmem.c; then echo "File libkmem.c exists"; else
  28. echo "x - extracting libkmem.c (Text)"
  29. sed 's/^X//' << 'SHAR_EOF' > libkmem.c &&
  30. X/* CHK=0x7937 */
  31. X/*+-------------------------------------------------------------------------
  32. X    libkmem.c -- /dev/kmem routines for SCO XENIX V/286 (maybe other *NIX)
  33. X
  34. X  Defined functions:
  35. X    kinit(write_needed)
  36. X    kread(caddr,kaddr,len)
  37. X    kwrite(kaddr,caddr,len)
  38. X
  39. X routines were originally written by Mike "Ford" Ditto: kudos!!!
  40. X--------------------------------------------------------------------------*/
  41. X/*+:EDITS:*/
  42. X/*:10-27-1988-12:44-wht-creation of file */
  43. X
  44. X#include <sys/types.h>
  45. X#include <fcntl.h>
  46. X#include "libkmem.h"
  47. X
  48. Xstatic int fdkmem;
  49. Xoff_t lseek();
  50. X
  51. X/*+-------------------------------------------------------------------------
  52. X    kinit(write_needed)
  53. X--------------------------------------------------------------------------*/
  54. Xvoid
  55. Xkinit(write_needed)
  56. Xint        write_needed;
  57. X{
  58. X    if((fdkmem=open("/dev/kmem",(write_needed) ? O_RDWR : O_RDONLY,0)) < 0)
  59. X    {
  60. X        perror("can't open /dev/kmem");
  61. X        exit(1);
  62. X    }
  63. X
  64. X}    /* end of kinit */
  65. X
  66. X/*+-------------------------------------------------------------------------
  67. X    kread(caddr,kaddr,len)
  68. X--------------------------------------------------------------------------*/
  69. Xvoid
  70. Xkread(caddr,kaddr,len)
  71. Xcaddr_t caddr;
  72. Xoff_t kaddr;
  73. Xoff_t len;
  74. X{
  75. Xchar    s80[80];
  76. X
  77. X    if((lseek(fdkmem,kaddr,0) < 0L) ||
  78. X        (read(fdkmem,caddr,(unsigned)len) != len))
  79. X    {
  80. X        sprintf(s80,"/dev/kmem read addr %08lx len %08lx",kaddr,len);
  81. X        perror(s80);
  82. X        exit(1);
  83. X    }
  84. X}    /* end of kread */
  85. X
  86. X/*+-------------------------------------------------------------------------
  87. X    kwrite(kaddr,caddr,len)
  88. X--------------------------------------------------------------------------*/
  89. Xvoid
  90. Xkwrite(kaddr,caddr,len)
  91. Xoff_t kaddr;
  92. Xcaddr_t caddr;
  93. Xoff_t len;
  94. X{
  95. Xchar    s80[80];
  96. X
  97. X    if((lseek(fdkmem,kaddr,0) < 0L) ||
  98. X        (write(fdkmem,caddr,(unsigned int)len) != (unsigned int)len))
  99. X    {
  100. X        sprintf(s80,"/dev/kmem write addr %08lx len %08lx",kaddr,len);
  101. X        perror(s80);
  102. X        exit(1);
  103. X    }
  104. X}    /* end of kwrite */
  105. X
  106. X/* vi: set tabstop=4 shiftwidth=4: */
  107. SHAR_EOF
  108. chmod 0644 libkmem.c || echo "restore of libkmem.c fails"
  109. fi
  110. if test -f libuxlst.c; then echo "File libuxlst.c exists"; else
  111. echo "x - extracting libuxlst.c (Text)"
  112. sed 's/^X//' << 'SHAR_EOF' > libuxlst.c &&
  113. X/* CHK=0x3487 */
  114. X/*+-------------------------------------------------------------------------
  115. X    libuxlst.c -- common runtime for uxlst users
  116. X
  117. X  Defined functions:
  118. X    uxlst_error(err_indicator)
  119. X    uxlst_read()
  120. X
  121. X--------------------------------------------------------------------------*/
  122. X/*+:EDITS:*/
  123. X/*:10-27-1988-11:44-wht-creation */
  124. X
  125. X#include <stdio.h>
  126. X#include <sys/types.h>
  127. X#include <sys/stat.h>
  128. X#include <fcntl.h>
  129. X#include <a.out.h>
  130. X
  131. X#define DEFINE_UXLST
  132. X#include "uxlst.h"
  133. X
  134. X#include "libuxlst.h"
  135. X
  136. X/*+-------------------------------------------------------------------------
  137. X    uxlst_error(err_indicator)
  138. X--------------------------------------------------------------------------*/
  139. Xvoid
  140. Xuxlst_error(err_indicator)
  141. Xint        err_indicator;
  142. X{
  143. X    if(err_indicator < 0)
  144. X        perror(XENIX_UXLST);
  145. X    fprintf(stderr,"run uxlst against %s\n",XENIX_KERNEL);
  146. X    exit(1);
  147. X}    /* end of uxlst_error */
  148. X
  149. X/*+-------------------------------------------------------------------------
  150. X    uxlst_read()
  151. X--------------------------------------------------------------------------*/
  152. Xvoid
  153. Xuxlst_read()
  154. X{
  155. Xint        itmp;
  156. Xint        fduxlst;
  157. Xstruct stat curstat;    /* current /xenix status */
  158. Xstruct stat xstat;        /* /xenix status at uxlst run time */
  159. Xlong    unique;
  160. X
  161. X    if(stat(XENIX_KERNEL,&curstat) < 0)
  162. X    {
  163. X        fputs("cannot stat ",stderr);
  164. X        perror(XENIX_KERNEL);
  165. X        exit(1);
  166. X    }
  167. X
  168. X    if((fduxlst = open(XENIX_UXLST,O_RDONLY,0)) < 0)
  169. X        uxlst_error(fduxlst);
  170. X
  171. X    if((itmp = read(fduxlst,&xstat,sizeof(xstat))) != sizeof(xstat))
  172. X    {
  173. X        fprintf(stderr,"xstat error: ");
  174. X        uxlst_error(itmp);
  175. X    }
  176. X
  177. X    if((itmp = read(fduxlst,uxlst,sizeof(uxlst))) != sizeof(uxlst))
  178. X    {
  179. X        fprintf("uxlst error: ");
  180. X        uxlst_error(itmp);
  181. X    }
  182. X
  183. X    if((itmp = read(fduxlst,&unique,sizeof(unique))) != sizeof(unique))
  184. X    {
  185. X        fprintf("unique error: ");
  186. X        uxlst_error(itmp);
  187. X    }
  188. X
  189. X    close(fduxlst);
  190. X
  191. X    if( (unique != UXLST_UNIQUE) ||
  192. X        (xstat.st_ino != curstat.st_ino) ||
  193. X        (xstat.st_mtime != curstat.st_mtime) ||
  194. X        (xstat.st_size != curstat.st_size))
  195. X    {
  196. X        fprintf(stderr,"%s out of date\n",XENIX_UXLST);
  197. X        uxlst_error(0);
  198. X    }
  199. X
  200. X}    /* end of uxlst_read */
  201. SHAR_EOF
  202. chmod 0644 libuxlst.c || echo "restore of libuxlst.c fails"
  203. fi
  204. if test -f uxlst.c; then echo "File uxlst.c exists"; else
  205. echo "x - extracting uxlst.c (Text)"
  206. sed 's/^X//' << 'SHAR_EOF' > uxlst.c &&
  207. X/* CHK=0xE9C1 */
  208. X/*+-------------------------------------------------------------------------
  209. X    uxlst.c -- utility xlist - fast access to kernel /dev/kmem offsets
  210. X--------------------------------------------------------------------------*/
  211. X/*+:EDITS:*/
  212. X/*:10-27-1988-10:58-wht-creation */
  213. X
  214. X#include <stdio.h>
  215. X#include <sys/types.h>
  216. X#include <sys/stat.h>
  217. X#include <fcntl.h>
  218. X#include <a.out.h>
  219. X
  220. X#define DEFINE_UXLST
  221. X#include "uxlst.h"
  222. X
  223. X/*+-------------------------------------------------------------------------
  224. X    uxlst_write_error()
  225. X--------------------------------------------------------------------------*/
  226. Xvoid
  227. Xuxlst_write_error()
  228. X{
  229. X    perror(XENIX_UXLST);
  230. X    exit(1);
  231. X}    /* end of uxlst_write_error */
  232. X
  233. X/*+-------------------------------------------------------------------------
  234. X    main(argc,argv,envp)
  235. X--------------------------------------------------------------------------*/
  236. Xmain(argc,argv,envp)
  237. Xint        argc;
  238. Xchar    **argv;
  239. Xchar    **envp;
  240. X{
  241. Xregister int itmp;
  242. Xregister struct xlist *xx;
  243. Xstruct stat xstat;        /* /xenix status at uxlst run time */
  244. Xint        fduxlst;
  245. Xint        xlist_error = 0;
  246. Xlong    unique;
  247. XFILE    *kludge;
  248. X
  249. X    xlist(XENIX_KERNEL,uxlst);
  250. X
  251. X    xx = uxlst;
  252. X    while(xx->xl_name)
  253. X    {
  254. X        if(xx->xl_type == 0)
  255. X        {
  256. X            printf("%s: can't xlist (try _%s ?)\n",
  257. X                xx->xl_name,xx->xl_name);
  258. X            xlist_error = 1;
  259. X            continue;
  260. X        }
  261. X        printf("%s  type: %04x seg: %04x value: %08lx\n",
  262. X            xx->xl_name,
  263. X            xx->xl_type,
  264. X            xx->xl_seg,
  265. X            xx->xl_value);
  266. X        xx++;
  267. X    }
  268. X
  269. X    if(xlist_error)
  270. X    {
  271. X        fprintf(stderr,"%s NOT produced\n",XENIX_UXLST);
  272. X        exit(1);
  273. X    }
  274. X
  275. X    if((kludge = fopen(XENIX_UXLST,"w")) == NULL)    /* scratch/create */
  276. X        uxlst_write_error(-1);
  277. X    fclose(kludge);
  278. X
  279. X    if((fduxlst = open(XENIX_UXLST,O_WRONLY,0)) < 0)
  280. X        uxlst_write_error(fduxlst);
  281. X
  282. X    if(stat(XENIX_KERNEL,&xstat) < 0)
  283. X    {
  284. X        fputs("cannot stat ",stderr);
  285. X        perror(XENIX_KERNEL);
  286. X        exit(1);
  287. X    }
  288. X
  289. X    if((itmp = write(fduxlst,&xstat,sizeof(xstat))) != sizeof(xstat))
  290. X        uxlst_write_error(itmp);
  291. X
  292. X    if((itmp = write(fduxlst,uxlst,sizeof(uxlst))) != sizeof(uxlst))
  293. X        uxlst_write_error(itmp);
  294. X
  295. X    unique = UXLST_UNIQUE;
  296. X    if((itmp = write(fduxlst,&unique,sizeof(unique))) != sizeof(unique))
  297. X        uxlst_write_error(itmp);
  298. X
  299. X    close(fduxlst);
  300. X    exit(0);
  301. X}    /* end of main */
  302. X
  303. X/* vi: set tabstop=4 shiftwidth=4: */
  304. SHAR_EOF
  305. chmod 0644 uxlst.c || echo "restore of uxlst.c fails"
  306. fi
  307. if test -f renice.c; then echo "File renice.c exists"; else
  308. echo "x - extracting renice.c (Text)"
  309. sed 's/^X//' << 'SHAR_EOF' > renice.c &&
  310. X/* CHK=0x98BA */
  311. X/*+-------------------------------------------------------------------------
  312. X    renice.c -- SCO Xenix V/286
  313. X
  314. X  Defined functions:
  315. X    kread(caddr,kaddr,nbytes)
  316. X    kwrite(kaddr,caddr,nbytes)
  317. X    main(argc,argv)
  318. X    renice(pid,value)
  319. X    kinit()
  320. X    usage()
  321. X
  322. X--------------------------------------------------------------------------*/
  323. X/*+:EDITS:*/
  324. X/*:10-27-1988-11:15-wht-use uxlst facilities to speed up program */
  325. X/*:10-26-1988-08:56-wht-fix it */
  326. X/*
  327. X * This program was written by me, Mike "Ford" Ditto, and
  328. X * I hereby release it into the public domain in the interest
  329. X * of promoting the development of free, quality software
  330. X * for the hackers and users of the world.
  331. X *
  332. X * Feel free to use, copy, modify, improve, and redistribute
  333. X * this program, but keep in mind the spirit of this
  334. X * contribution; always provide source, and always allow
  335. X * free redistribution (shareware is fine with me).  If
  336. X * you use a significant part of this code in a program of
  337. X * yours, I would appreciate being given the appropriate
  338. X * amount of credit.
  339. X *                -=] Ford [=-
  340. X *
  341. X *
  342. X *    Modifications
  343. X *    3/3/88    Ported to Plexus Unix System V    pigs!haugj@rpp386.uucp
  344. X *    3/3/88    Ported to SCO Xenix System V    jfh@rpp386.uucp
  345. X *    10/26/88 SCO Xenix V/286 and BSD 4 syntax wht
  346. X ************************************************************/
  347. X
  348. X#include <stdio.h>
  349. X#include <fcntl.h>
  350. X#include <ctype.h>
  351. X#include <errno.h>
  352. X#include <sys/types.h>
  353. X#include <sys/param.h>
  354. X#include <sys/proc.h>
  355. X#include <sys/var.h>
  356. X#include <a.out.h>
  357. X#include "uxlst.h"
  358. X#include "libuxlst.h"
  359. X#include "libkmem.h"
  360. X
  361. Xlong lseek();
  362. Xvoid perror();
  363. Xvoid exit();
  364. X
  365. Xvoid kread();
  366. Xvoid kwrite();
  367. X
  368. Xchar buf[BUFSIZ];
  369. X
  370. Xint myuid;
  371. Xint NPROC;
  372. Xstruct proc proctab;
  373. Xstruct var v;
  374. X
  375. Xvoid
  376. Xusage()
  377. X{
  378. X    fprintf(stderr,"usage: renice <nice> pid ...\n");
  379. X    fprintf(stderr,"<nice> must be in range of -20 through 19\n");
  380. X    exit(-1);
  381. X}
  382. X
  383. X
  384. X/* change the nice value of process (value from 0 to 39) */
  385. Xint
  386. Xrenice(pid,value)
  387. Xint pid,value;
  388. X{
  389. X    register i;
  390. X    int oldnice;
  391. X    long kaddr;
  392. X
  393. X    if(value > 39)
  394. X        value = 39;
  395. X    if(value < 0)
  396. X        value = 0;
  397. X
  398. X    for (i=0 ; i<NPROC ; ++i)
  399. X    {
  400. X        kaddr = procaddr + (i * sizeof(struct proc));
  401. X        kread((char *)&proctab,kaddr,(long)sizeof(proctab));
  402. X        if(proctab.p_pid == pid)
  403. X        {
  404. X            if(myuid && ((myuid != proctab.p_uid) || (value < proctab.p_nice)))
  405. X            {
  406. X                errno = EACCES;
  407. X                sprintf(buf,"%d",pid);
  408. X                perror(buf);
  409. X                return(1);
  410. X            }
  411. X
  412. X            oldnice = proctab.p_nice;
  413. X            proctab.p_nice = value;
  414. X
  415. X            kaddr = procaddr + (i * sizeof(struct proc))
  416. X                + ((char *)&proctab.p_nice - (char *)&proctab),
  417. X            kwrite(kaddr,(char *)&proctab.p_nice,(long)sizeof(proctab.p_nice));
  418. X            printf("%d: old priority %d, new priority %d\n",
  419. X                pid,oldnice - 20,value - 20);
  420. X            return(0);
  421. X        }
  422. X    }
  423. X
  424. X    printf("%d: no such process\n",pid);
  425. X    return(1);
  426. X}
  427. X
  428. Xmain(argc,argv)
  429. Xint argc;
  430. Xchar **argv;
  431. X{
  432. Xint        status = 0;
  433. Xint        pid;
  434. Xint        value;
  435. Xint        iargv;
  436. X
  437. X    uxlst_read();
  438. X    kinit(1);
  439. X    kread((char *)&v,vaddr,(long)sizeof(v));
  440. X    NPROC = v.v_proc;
  441. X    myuid = getuid();
  442. X    setuid(myuid);
  443. X
  444. X    if(argc < 3)
  445. X        usage();
  446. X
  447. X    value = atoi(argv[1]);
  448. X    if(value < -20)
  449. X        usage();
  450. X    if(value > 19)
  451. X        usage();
  452. X
  453. X    value += 20;
  454. X
  455. X    for(iargv = 2; iargv < argc; iargv++)
  456. X    {
  457. X        pid = atoi(argv[iargv]);
  458. X        renice(pid,value);
  459. X    }
  460. X
  461. X    exit(0);
  462. X}
  463. X
  464. X/* vi: set tabstop=4 shiftwidth=4: */
  465. SHAR_EOF
  466. chmod 0644 renice.c || echo "restore of renice.c fails"
  467. fi
  468. exit 0
  469. ----------------------------------------------------------
  470. W. Tucker ...!gatech!{emory,kd4nc}!tridom!wht
  471.