home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume12 / cnews / part11 < prev    next >
Text File  |  1987-10-22  |  48KB  |  1,652 lines

  1. Subject:  v12i036:  C News alpha release, Part11/14
  2. Newsgroups: comp.sources.unix
  3. Sender: sources
  4. Approved: rs@uunet.UU.NET
  5.  
  6. Submitted-by: utzoo!henry (Henry Spencer)
  7. Posting-number: Volume 12, Issue 36
  8. Archive-name: cnews/part11
  9.  
  10.  
  11. #! /bin/sh
  12. # This is a shell archive.  Remove anything before this line, then unpack
  13. # it by saving it into a file and typing "sh file".  To overwrite existing
  14. # files, type "sh file -c".  You can also feed this as standard input via
  15. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  16. # will see the following message at the end:
  17. #        "End of archive 11 (of 14)."
  18. if test -f 'lib.proto/newsgroups' -a "${1}" != "-c" ; then 
  19.   echo shar: Will not clobber existing file \"'lib.proto/newsgroups'\"
  20. else
  21. echo shar: Extracting \"'lib.proto/newsgroups'\" \(16226 characters\)
  22. sed "s/^X//" >'lib.proto/newsgroups' <<'END_OF_FILE'
  23. Xcontrol        control message repository
  24. Xjunk        rubbish bin
  25. Xutstat.general    general-interest news for all users
  26. Xutstat.hacknews    news primarily of interest to hacks
  27. Xutstat.gripes    complaints (and answers thereto)
  28. Xutstat.deadletter    disused dead-letter collection
  29. Xutstat.test    local tests
  30. Xutstat.control
  31. Xutstat.junk
  32. Xto.utstat    testing news links ...
  33. Xto.utgpu
  34. Xto.utzoo
  35. Xut.general    U of T local groups ...
  36. Xut.16k
  37. Xut.vlsi
  38. Xut.supercomputer
  39. Xut.theory    vague CSRI CS `theory' group
  40. Xut.na        numerical applications
  41. Xtor.general    Toronto local groups ...
  42. Xtor.news
  43. Xtor.news.stats
  44. Xont.general    General news local to Ontario sites ...
  45. Xont.events    Seminars and the like at Ont. sites
  46. Xont.jobs    Help-wanted column for Ont. sites
  47. Xont.micro    micro-processors for Ont. sites
  48. Xont.singles    pain and pleasure of singlitude for Ont. sites
  49. Xont.uucp    status reports on connections from utzoo for Ont. sites
  50. Xont.test
  51. Xont.sf-lovers
  52. Xcan.general    general news local to Canadian sites ...
  53. Xcan.jobs
  54. Xcan.ai
  55. Xcan.politics
  56. Xcan.francais
  57. Xlist.ailist    mailing lists from Bitnet...
  58. Xlist.bind
  59. Xlist.can-inet
  60. Xlist.comm-l
  61. Xlist.dtp
  62. Xlist.future-l
  63. Xlist.ibm-nets
  64. Xlist.info-1100
  65. Xlist.info-futures
  66. Xlist.info-nets
  67. Xlist.info-postscript
  68. Xlist.iso
  69. Xlist.license
  70. Xlist.macsyma
  71. Xlist.mail-l
  72. Xlist.mh-users
  73. Xlist.mh-workers
  74. Xlist.mhs_implementation
  75. Xlist.namedroppers
  76. Xlist.netmonth
  77. Xlist.netnws-l
  78. Xlist.neuron
  79. Xlist.news-makers
  80. Xlist.nl-kr
  81. Xlist.nnmail-l
  82. Xlist.rscsmods
  83. Xlist.rscsv2-l
  84. Xlist.s-comput
  85. Xlist.sas-l
  86. Xlist.security
  87. Xlist.servers
  88. Xlist.slug
  89. Xlist.spssx-l
  90. Xlist.std-l
  91. Xlist.sun-spots
  92. Xlist.texhax
  93. Xlist.texmag-l
  94. Xlist.trafic-l
  95. Xlist.trans-l
  96. Xlist.unix-sw
  97. Xlist.unix-tex
  98. Xlist.usrdir-l
  99. Xlist.vision-list
  100. Xlist.x400-l
  101. Xlist.xpert
  102. Xlist.domain-l
  103. Xlist.pc-token
  104. Xlist.big-lan
  105. Xlist.humanist
  106. Xlist.ibmtcp-l
  107. Xcomp.ai            Artificial intelligence discussions.
  108. Xcomp.ai.digest        Artificial Intelligence discussions. (Moderated)
  109. Xcomp.arch        Computer architecture.
  110. Xcomp.binaries.amiga    Encoded public domain programs in binary. (Moderated)
  111. Xcomp.binaries.atari.st    Binary-only postings for the Atari ST. (Moderated)
  112. Xcomp.binaries.ibm.pc    Binary-only postings for IBM PC/MS-DOS. (Moderated)
  113. Xcomp.binaries.mac    Encoded Macintosh programs in binary. (Moderated)
  114. Xcomp.bugs.2bsd        Reports of UNIX* version 2BSD related bugs.
  115. Xcomp.bugs.4bsd        Reports of UNIX version 4BSD related bugs.
  116. Xcomp.bugs.4bsd.ucb-fixes    Bug reports/fixes for BSD Unix. (Moderated)
  117. Xcomp.bugs.misc        General UNIX bug reports and fixes (incl V7, uucp)
  118. Xcomp.bugs.sys5        Reports of USG (System III, V, etc.) bugs.
  119. Xcomp.cog-eng        Cognitive engineering.
  120. Xcomp.compilers        Compiler construction, theory, etc. (Moderated)
  121. Xcomp.databases        Database and data management issues and theory.
  122. Xcomp.dcom.lans        Local area network hardware and software.
  123. Xcomp.dcom.modems    Data communications hardware and software.
  124. Xcomp.dcom.telecom    Telecommunications digest. (Moderated)
  125. Xcomp.doc        Archived public-domain documentation. (Moderated)
  126. Xcomp.doc.techreports    Lists of technical reports. (Moderated)
  127. Xcomp.edu        Computer science education.
  128. Xcomp.emacs        EMACS editors of different flavors.
  129. Xcomp.graphics        Computer graphics, art, animation, image processing.
  130. Xcomp.graphics.digest    Graphics software, hardware, theory, etc. (Moderated)
  131. Xcomp.hypercube        Massively parallel systems: hardware & software. (Moderated)
  132. Xcomp.lang.ada        Discussion about Ada*.
  133. Xcomp.lang.apl        Discussion about APL.
  134. Xcomp.lang.c        Discussion about C.
  135. Xcomp.lang.c++        The object-oriented C++ language.
  136. Xcomp.lang.forth        Discussion about Forth.
  137. Xcomp.lang.fortran    Discussion about FORTRAN.
  138. Xcomp.lang.lisp        Discussion about LISP.
  139. Xcomp.lang.misc        Different computer languages not specifically listed.
  140. Xcomp.lang.modula2    Discussion about Modula-2.
  141. Xcomp.lang.pascal    Discussion about Pascal.
  142. Xcomp.lang.prolog    Discussion about PROLOG.
  143. Xcomp.lang.smalltalk    Discussion about Smalltalk 80.
  144. Xcomp.laser-printers    Laser printers, hardware & software. (Moderated)
  145. Xcomp.lsi        Large scale integrated circuits.
  146. Xcomp.mail.elm        Discussion and fixes for ELM mail system. 
  147. Xcomp.mail.headers    Gatewayed from the ARPA header-people list.
  148. Xcomp.mail.maps        Various maps, including UUCP maps. (Moderated)
  149. Xcomp.mail.misc        General discussions about computer mail.
  150. Xcomp.mail.uucp        Mail in the uucp network environment.
  151. Xcomp.misc        General topics about computers not covered elsewhere.
  152. Xcomp.newprod        Announcements of new products of interest. (Moderated)
  153. Xcomp.org.decus        DEC* Users' Society newsgroup.
  154. Xcomp.org.fidonet    FidoNews digest, official news of FidoNet Assoc. (Moderated)
  155. Xcomp.org.usenix        USENIX Association events and announcements.
  156. Xcomp.os.cpm        Discussion about the CP/M operating system.
  157. Xcomp.os.eunice        The SRI Eunice system.
  158. Xcomp.os.minix        Discussion of Tanenbaum's MINIX system.
  159. Xcomp.os.misc        General OS-oriented discussion not carried elsewhere.
  160. Xcomp.os.os9        Discussions about the os9 operating system. (Moderated)
  161. Xcomp.os.research    Operating systems and related areas. (Moderated)
  162. Xcomp.os.vms        DEC's VAX* line of computers & VMS.
  163. Xcomp.periphs        Peripheral devices.
  164. Xcomp.protocols.appletalk    Applebus hardware & software.
  165. Xcomp.protocols.kermit    Info about the Kermit package. (Moderated)
  166. Xcomp.protocols.misc    Various forms and types of FTP protocol.
  167. Xcomp.protocols.tcp-ip    TCP and IP network protocols.
  168. Xcomp.risks        Risks to the public from computers & users. (Moderated)
  169. Xcomp.society        The impact of technology on society. (Moderated)
  170. Xcomp.sources.amiga    Source code-only postings for the Amiga. (Moderated)
  171. Xcomp.sources.atari.st    Source code-only postings for the Atari ST. (Moderated)
  172. Xcomp.sources.bugs    Bug reports, fixes, discussion for posted sources
  173. Xcomp.sources.d        For any discussion of source postings.
  174. Xcomp.sources.games    Postings of recreational software. (Moderated)
  175. Xcomp.sources.mac    Software for the Apple Macintosh. (Moderated)
  176. Xcomp.sources.misc    Posting of software . (Moderated)
  177. Xcomp.sources.unix    Postings of complete, UNIX-oriented sources. (Moderated)
  178. Xcomp.sources.wanted    Requests for software and fixes.
  179. Xcomp.std.c        Discussion about C language standards. (Moderated)
  180. Xcomp.std.internat    Discussion about international standards.
  181. Xcomp.std.misc        Discussion about various standards. (Moderated)
  182. Xcomp.std.mumps        Discussion for the X11.1 committee on Mumps. (Moderated)
  183. Xcomp.std.unix        Discussion for the P1003 committee on UNIX. (Moderated)
  184. Xcomp.sys.amiga        Commodore Amiga: info&uses, but no programs.
  185. Xcomp.sys.apollo        Apollo computer systems.
  186. Xcomp.sys.apple        Discussion about Apple micros.
  187. Xcomp.sys.atari.8bit    Discussion about 8 bit Atari micros.
  188. Xcomp.sys.atari.st    Discussion about 16 bit Atari micros.
  189. Xcomp.sys.att        Discussions about AT&T microcomputers.
  190. Xcomp.sys.cbm        Discussion about Commodore micros.
  191. Xcomp.sys.dec        Discussions about DEC computer systems.
  192. Xcomp.sys.hp        Discussion about Hewlett-Packard equipment.
  193. Xcomp.sys.ibm.pc        Discussion about IBM personal computers.
  194. Xcomp.sys.ibm.pc.digest    The IBM PC, PC-XT, and PC-AT. (Moderated)
  195. Xcomp.sys.intel        Disucussions about Intel systems and parts.
  196. Xcomp.sys.m6809        Discussion about 6809's.
  197. Xcomp.sys.m68k        Discussion about 68k's.
  198. Xcomp.sys.m68k.pc    Discussion about 68k-based PCs. (Moderated)
  199. Xcomp.sys.mac        Discussions about the Apple Macintosh & Lisa.
  200. Xcomp.sys.mac.digest    Apple Macintosh: info&uses, but no programs. (Moderated)
  201. Xcomp.sys.masscomp    The Masscomp line of computers. (Moderated)
  202. Xcomp.sys.misc        Discussion about computers of all kinds.
  203. Xcomp.sys.nsc.32k    National Semiconductor 32000 series chips.
  204. Xcomp.sys.pyramid    Pyramid 90x computers.
  205. Xcomp.sys.ridge        Ridge 32 computers and ROS. 
  206. Xcomp.sys.sequent    Sequent systems, (esp. Balance 8000). (Moderated)
  207. Xcomp.sys.sun        Sun "workstation" computers. (Moderated)
  208. Xcomp.sys.tandy        Discussion about TRS-80's.
  209. Xcomp.sys.ti        Discussion about Texas Instruments.
  210. Xcomp.sys.workstations    Various workstation-type computers. (Moderated)
  211. Xcomp.terminals        All sorts of terminals.
  212. Xcomp.text        Text processing issues and methods.
  213. Xcomp.text.desktop    Technolgy & techniques of desktop publishing. (Moderated)
  214. Xcomp.unix        Discussion of UNIX* features and bugs. (Moderated)
  215. Xcomp.unix.questions    UNIX neophytes group.
  216. Xcomp.unix.ultrix    Discussions about DEC's Ultrix. (Moderated)
  217. Xcomp.unix.wizards    Discussions, bug reports, and fixes on and for UNIX.
  218. Xcomp.unix.xenix        Discussion about the Xenix OS.
  219. Xcomp.windows.misc    Various issues about windowing systems.
  220. Xcomp.windows.news    Sun Microsystems' NewS window system.
  221. Xcomp.windows.x        Discussion about the X Window System.
  222. Xmisc.consumers        Consumer interests, product reviews, etc.
  223. Xmisc.consumers.house    Discussion about owning and maintaining a house.
  224. Xmisc.forsale        Short, tasteful postings about items for sale.
  225. Xmisc.handicap        Items of interest for/about the handicapped. (Moderated)
  226. Xmisc.headlines        Current interest: drug testing, terrorism, etc.
  227. Xmisc.invest        Investments and the handling of money.
  228. Xmisc.jobs.misc        Discussion about employment, workplaces, careers.
  229. Xmisc.jobs.offered    Announcements of positions available.
  230. Xmisc.jobs.resumes    Postings of resumes and "situation wanted" articles.
  231. Xmisc.kids        Children, their behavior and activities.
  232. Xmisc.legal        Legalities and the ethics of law.
  233. Xmisc.misc        Various discussions not fitting in any other group.
  234. Xmisc.psi        Paranormal abilities and experiences. (Moderated)
  235. Xmisc.taxes        Tax laws and advice.
  236. Xmisc.test        For testing of network software.  Very boring.
  237. Xmisc.wanted        Requests for things that are needed (NOT software).
  238. Xnews.admin        Comments directed to news administrators.
  239. Xnews.announce.conferences    Calls for papers and conference announcements. (Moderated)
  240. Xnews.announce.important    General announcements of interest to all. (Moderated)
  241. Xnews.announce.newusers    Explanatory postings for new users. (Moderated)
  242. Xnews.config        Postings of system down times and interruptions.
  243. Xnews.groups        Discussions and lists of newsgroups.
  244. Xnews.lists        News-related statistics and lists. (Moderated)
  245. Xnews.misc        Discussions of USENET itself.
  246. Xnews.newsites        Postings of new site announcements.
  247. Xnews.software.b        Discussion about B news software.
  248. Xnews.software.notes    Notesfile software from the Univ. of Illinois.
  249. Xnews.stargate        Discussion about satellite transmission of news.
  250. Xnews.sysadmin        Comments directed to system administrators.
  251. Xrec.arts.books        Books of all genres, shapes, and sizes.
  252. Xrec.arts.comics        The funnies, old and new.
  253. Xrec.arts.drwho        Discussion about Dr. Who.
  254. Xrec.arts.int-fiction    Discussions about interactive fiction.
  255. Xrec.arts.movies        Discussions of movies and movie making.
  256. Xrec.arts.movies.reviews    Reviews of movies. (Moderated)
  257. Xrec.arts.poems        For the posting of poems.
  258. Xrec.arts.sf-lovers    Science fiction lovers' newsgroup.
  259. Xrec.arts.startrek    Star Trek, the TV show and the movies.
  260. Xrec.arts.tv        The boob tube, its history, and past and current shows.
  261. Xrec.arts.tv.soaps    Postings about soap operas.
  262. Xrec.arts.wobegon    "A Prairie Home Companion" radio show discussion.
  263. Xrec.audio        High fidelity audio.
  264. Xrec.autos        Automobiles, automotive products and laws.
  265. Xrec.autos.tech        Technical aspects of automobiles, et. al.
  266. Xrec.aviation        Aviation rules, means, and methods.
  267. Xrec.bicycles        Bicycles, related products and laws.
  268. Xrec.birds        Hobbyists interested in bird watching.
  269. Xrec.boats        Hobbyists interested in boating.
  270. Xrec.food.cooking    Food, cooking, cookbooks, and recipes.
  271. Xrec.food.drink        Wines and spirits.
  272. Xrec.food.recipes    Recipes from the USENET Cookbook (troff & text). (Moderated)
  273. Xrec.food.veg        Vegetarians.
  274. Xrec.games.board        Discussion and hints on board games.
  275. Xrec.games.bridge    Hobbyists interested in bridge.
  276. Xrec.games.chess        Chess & computer chess.
  277. Xrec.games.empire    Discussion and hints about Empire.
  278. Xrec.games.frp        Discussion about Fantasy Role Playing games.
  279. Xrec.games.go        Discussion about Go.
  280. Xrec.games.hack        Discussion, hints, etc. about the Hack game.
  281. Xrec.games.misc        Games and computer games.
  282. Xrec.games.pbm        Discussion about Play by Mail games.
  283. Xrec.games.rogue        Discussion and hints about Rogue.
  284. Xrec.games.trivia    Discussion about trivia.
  285. Xrec.games.video        Discussion about video games.
  286. Xrec.gardens        Gardening, methods and results.
  287. Xrec.guns        Discussions about firearms. (Moderated)
  288. Xrec.ham-radio        Amateur Radio practices, contests, events, rules, etc.
  289. Xrec.ham-radio.packet    Discussion about packet radio setups.
  290. Xrec.humor        Jokes and the like.  May be somewhat offensive.
  291. Xrec.humor.d        Discussions on the content of rec.humor articles.
  292. Xrec.humor.funny        Jokes that are funny (in the moderator's opinion).  (Moderated)
  293. Xrec.humor.spc        The Stupid People's Court! (Moderated)
  294. Xrec.mag            Magazine summaries, tables of contents, etc.
  295. Xrec.mag.otherrealms    Edited science fiction & fantasy "magazine". (Moderated)
  296. Xrec.misc        General topics about recreational/participant sports.
  297. Xrec.motorcycles        Motorcycles and related products and laws.
  298. Xrec.music.beatles    Postings about the Fab Four & their music.
  299. Xrec.music.classical    Discussion about classical music.
  300. Xrec.music.folk        Folks discussing folk music of various sorts.
  301. Xrec.music.gaffa        Progressive music (e.g., Kate Bush). (Moderated)
  302. Xrec.music.gdead        A group for (Grateful) Dead-heads.
  303. Xrec.music.makers    For performers and their discussions.
  304. Xrec.music.misc        Music lovers' group.
  305. Xrec.music.synth        Synthesizers and computer music.
  306. Xrec.nude        Hobbyists interested in naturist/nudist activities.
  307. Xrec.pets        Pets, pet care, and household animals in general.
  308. Xrec.photo        Hobbyists interested in photography.
  309. Xrec.puzzles        Puzzles, problems, and quizzes.
  310. Xrec.railroad        Real and model train fans' newsgroup.
  311. Xrec.scuba        Hobbyists interested in SCUBA diving.
  312. Xrec.skiing        Hobbyists interested in skiing.
  313. Xrec.skydiving        Hobbyists interested in skydiving.
  314. Xrec.sport.baseball    Discussion about baseball.
  315. Xrec.sport.basketball    Discussion about basketball.
  316. Xrec.sport.football    Discussion about football.
  317. Xrec.sport.hockey    Discussion about hockey.
  318. Xrec.sport.misc        Spectator sports.
  319. Xrec.travel        Traveling all over the world.
  320. Xrec.video        Video and video components.
  321. Xrec.woodworking        Hobbyists interested in woodworking.
  322. Xsci.astro        Astronomy discussions and information.
  323. Xsci.bio            Biology and related sciences.
  324. Xsci.crypt        Different methods of data en/decryption.
  325. Xsci.electronics        Circuits, theory, electrons and discussions.
  326. Xsci.lang        Natural languages, communication, etc.
  327. Xsci.math        Mathematical discussions and pursuits.
  328. Xsci.math.stat        Statistics discussion.
  329. Xsci.math.symbolic    Symbolic algebra discussion.
  330. Xsci.med            Medicine and its related products and regulations.
  331. Xsci.med.aids        AIDS: treatment, pathology/biology of HIV, prevention. (Moderated)
  332. Xsci.misc        Short-lived discussions on subjects in the sciences.
  333. Xsci.philosophy.tech    Technical philosophy: math, science, logic, etc. 
  334. Xsci.physics        Physical laws, properties, etc.
  335. Xsci.research        Research methods, funding, ethics, and whatever.
  336. Xsci.space        Space, space programs, space related research, etc.
  337. Xsci.space.shuttle    The space shuttle and the STS program.
  338. Xsoc.college        College, college activities, campus life, etc.
  339. Xsoc.culture.african    Discussions about Africa & things African.
  340. Xsoc.culture.celtic    Group about Celts (*not* basketball!).
  341. Xsoc.culture.greek    Group about Greeks.
  342. Xsoc.culture.indian    Group for discussion about India & things Indian.
  343. Xsoc.culture.jewish    Group for discussion about Jewish culture & religion.
  344. Xsoc.culture.misc    Group for discussion about other cultures.
  345. Xsoc.human-nets        Computer aided communications digest. (Moderated)
  346. Xsoc.men            Issues related to men, their problems & relationships.
  347. Xsoc.misc        Socially-oriented topics not in other groups.
  348. Xsoc.motss        Issues pertaining to homosexuality.
  349. Xsoc.net-people        Announcements, requests, etc. about people on the net.
  350. Xsoc.politics        Political problems, systems, solutions. (Moderated)
  351. Xsoc.politics.arms-d    Arms discussion digest. (Moderated)
  352. Xsoc.religion.christian    Christianity and related topics. (Moderated)
  353. Xsoc.roots        Genealogical matters.
  354. Xsoc.singles        Newsgroup for single people, their activities, etc.
  355. Xsoc.women        Women's rights, discrimination, etc.
  356. Xtalk.abortion        All sorts of discussions and arguments on abortion.
  357. Xtalk.bizarre        The unusual, bizarre, curious, and often stupid.
  358. Xtalk.origins        Evolution versus creationism (sometimes hot!).
  359. Xtalk.philosophy.misc    Philosophical musings on all topics.
  360. Xtalk.politics.misc    Political discussions and ravings of all kinds.
  361. Xtalk.politics.theory    Theory of politics and political systems.
  362. Xtalk.religion.misc    Religious, ethical, & moral implications.
  363. Xtalk.religion.newage    Esoteric and minority religions & philosophies.
  364. Xtalk.rumors        For the posting of rumors.
  365. END_OF_FILE
  366. if test 16226 -ne `wc -c <'lib.proto/newsgroups'`; then
  367.     echo shar: \"'lib.proto/newsgroups'\" unpacked with wrong size!
  368. fi
  369. # end of 'lib.proto/newsgroups'
  370. fi
  371. if test -f 'libc/getdate.y' -a "${1}" != "-c" ; then 
  372.   echo shar: Will not clobber existing file \"'libc/getdate.y'\"
  373. else
  374. echo shar: Extracting \"'libc/getdate.y'\" \(11603 characters\)
  375. sed "s/^X//" >'libc/getdate.y' <<'END_OF_FILE'
  376. X%token ID MONTH DAY MERIDIAN NUMBER UNIT MUNIT SUNIT ZONE DAYZONE AGO
  377. X%{
  378. X    /*     Steven M. Bellovin (unc!smb)            */
  379. X    /*    Dept. of Computer Science            */
  380. X    /*    University of North Carolina at Chapel Hill    */
  381. X    /*    @(#)getdate.y    2.5    3/3/83    */
  382. X
  383. X#include <sys/types.h>
  384. X#ifdef USG
  385. Xstruct timeb
  386. X{
  387. X    time_t    time;
  388. X    unsigned short millitm;
  389. X    short    timezone;
  390. X    short    dstflag;
  391. X};
  392. X#else
  393. X#include <sys/timeb.h>
  394. X#endif
  395. X#include <ctype.h>
  396. X#include <time.h>
  397. X
  398. X#define    NULL    0
  399. X#define daysec (24L*60L*60L)
  400. X    static int timeflag, zoneflag, dateflag, dayflag, relflag;
  401. X    static time_t relsec, relmonth;
  402. X    static int hh, mm, ss, merid, daylight;
  403. X    static int dayord, dayreq;
  404. X    static int month, day, year;
  405. X    static int ourzone;
  406. X#define AM 1
  407. X#define PM 2
  408. X#define DAYLIGHT 1
  409. X#define STANDARD 2
  410. X#define MAYBE    3
  411. X%}
  412. X
  413. X%%
  414. Xtimedate:         /* empty */
  415. X    | timedate item;
  416. X
  417. Xitem:    tspec =
  418. X        {timeflag++;}
  419. X    | zone =
  420. X        {zoneflag++;}
  421. X    | dtspec =
  422. X        {dateflag++;}
  423. X    | dyspec =
  424. X        {dayflag++;}
  425. X    | rspec =
  426. X        {relflag++;}
  427. X    | nspec;
  428. X
  429. Xnspec:    NUMBER =
  430. X        {if (timeflag && dateflag && !relflag) year = $1;
  431. X        else {timeflag++;hh = $1/100;mm = $1%100;ss = 0;merid = 24;}};
  432. X
  433. Xtspec:    NUMBER MERIDIAN =
  434. X        {hh = $1; mm = 0; ss = 0; merid = $2;}
  435. X    | NUMBER ':' NUMBER =
  436. X        {hh = $1; mm = $3; merid = 24;}
  437. X    | NUMBER ':' NUMBER MERIDIAN =
  438. X        {hh = $1; mm = $3; merid = $4;}
  439. X    | NUMBER ':' NUMBER ':' NUMBER =
  440. X        {hh = $1; mm = $3; ss = $5; merid = 24;}
  441. X    | NUMBER ':' NUMBER ':' NUMBER MERIDIAN =
  442. X        {hh = $1; mm = $3; ss = $5; merid = $6;};
  443. X
  444. Xzone:    ZONE =
  445. X        {ourzone = $1; daylight = STANDARD;}
  446. X    | DAYZONE =
  447. X        {ourzone = $1; daylight = DAYLIGHT;};
  448. X
  449. Xdyspec:    DAY =
  450. X        {dayord = 1; dayreq = $1;}
  451. X    | DAY ',' =
  452. X        {dayord = 1; dayreq = $1;}
  453. X    | NUMBER DAY =
  454. X        {dayord = $1; dayreq = $2;};
  455. X
  456. Xdtspec:    NUMBER '/' NUMBER =
  457. X        {month = $1; day = $3;}
  458. X    | NUMBER '/' NUMBER '/' NUMBER =
  459. X        {month = $1; day = $3; year = $5;}
  460. X    | MONTH NUMBER =
  461. X        {month = $1; day = $2;}
  462. X    | MONTH NUMBER ',' NUMBER =
  463. X        {month = $1; day = $2; year = $4;}
  464. X    | NUMBER MONTH =
  465. X        {month = $2; day = $1;}
  466. X    | NUMBER MONTH NUMBER =
  467. X        {month = $2; day = $1; year = $3;};
  468. X
  469. X
  470. Xrspec:    NUMBER UNIT =
  471. X        {relsec +=  60L * $1 * $2;}
  472. X    | NUMBER MUNIT =
  473. X        {relmonth += $1 * $2;}
  474. X    | NUMBER SUNIT =
  475. X        {relsec += $1;}
  476. X    | UNIT =
  477. X        {relsec +=  60L * $1;}
  478. X    | MUNIT =
  479. X        {relmonth += $1;}
  480. X    | SUNIT =
  481. X        {relsec++;}
  482. X    | rspec AGO =
  483. X        {relsec = -relsec; relmonth = -relmonth;};
  484. X%%
  485. X
  486. Xstatic int mdays[12] =
  487. X    {31, 0, 31,  30, 31, 30,  31, 31, 30,  31, 30, 31};
  488. X#define epoch 1970
  489. X
  490. Xextern struct tm *localtime();
  491. Xtime_t dateconv(mm, dd, yy, h, m, s, mer, zone, dayflag)
  492. Xint mm, dd, yy, h, m, s, mer, zone, dayflag;
  493. X{
  494. X    time_t tod, jdate;
  495. X    register int i;
  496. X    time_t timeconv();
  497. X
  498. X    if (yy < 0) yy = -yy;
  499. X    if (yy < 100) yy += 1900;
  500. X    mdays[1] = 28 + (yy%4 == 0);
  501. X    if (yy < epoch || yy > 1999 || mm < 1 || mm > 12 ||
  502. X        dd < 1 || dd > mdays[--mm]) return (-1);
  503. X    jdate = dd-1;
  504. X        for (i=0; i<mm; i++) jdate += mdays[i];
  505. X    for (i = epoch; i < yy; i++) jdate += 365 + (i%4 == 0);
  506. X    jdate *= daysec;
  507. X    jdate += zone * 60L;
  508. X    if ((tod = timeconv(h, m, s, mer)) < 0) return (-1);
  509. X    jdate += tod;
  510. X    if (dayflag==DAYLIGHT || (dayflag==MAYBE&&localtime(&jdate)->tm_isdst))
  511. X        jdate += -1*60*60;
  512. X    return (jdate);
  513. X}
  514. X
  515. Xtime_t dayconv(ord, day, now) int ord, day; time_t now;
  516. X{
  517. X    register struct tm *loctime;
  518. X    time_t tod;
  519. X    time_t daylcorr();
  520. X
  521. X    tod = now;
  522. X    loctime = localtime(&tod);
  523. X    tod += daysec * ((day - loctime->tm_wday + 7) % 7);
  524. X    tod += 7*daysec*(ord<=0?ord:ord-1);
  525. X    return daylcorr(tod, now);
  526. X}
  527. X
  528. Xtime_t timeconv(hh, mm, ss, mer) register int hh, mm, ss, mer;
  529. X{
  530. X    if (mm < 0 || mm > 59 || ss < 0 || ss > 59) return (-1);
  531. X    switch (mer) {
  532. X        case AM: if (hh < 1 || hh > 12) return(-1);
  533. X             return (60L * ((hh%12)*60L + mm)+ss);
  534. X        case PM: if (hh < 1 || hh > 12) return(-1);
  535. X             return (60L * ((hh%12 +12)*60L + mm)+ss);
  536. X        case 24: if (hh < 0 || hh > 23) return (-1);
  537. X             return (60L * (hh*60L + mm)+ss);
  538. X        default: return (-1);
  539. X    }
  540. X}
  541. Xtime_t monthadd(sdate, relmonth) time_t sdate, relmonth;
  542. X{
  543. X    struct tm *ltime;
  544. X    time_t dateconv();
  545. X    time_t daylcorr();
  546. X    int mm, yy;
  547. X
  548. X    if (relmonth == 0) return 0;
  549. X    ltime = localtime(&sdate);
  550. X    mm = 12*ltime->tm_year + ltime->tm_mon + relmonth;
  551. X    yy = mm/12;
  552. X    mm = mm%12 + 1;
  553. X    return daylcorr(dateconv(mm, ltime->tm_mday, yy, ltime->tm_hour,
  554. X        ltime->tm_min, ltime->tm_sec, 24, ourzone, MAYBE), sdate);
  555. X}
  556. X
  557. Xtime_t daylcorr(future, now) time_t future, now;
  558. X{
  559. X    int fdayl, nowdayl;
  560. X
  561. X    nowdayl = (localtime(&now)->tm_hour+1) % 24;
  562. X    fdayl = (localtime(&future)->tm_hour+1) % 24;
  563. X    return (future-now) + 60L*60L*(nowdayl-fdayl);
  564. X}
  565. X
  566. Xstatic char *lptr;
  567. X
  568. Xyylex()
  569. X{
  570. X    extern int yylval;
  571. X    int sign;
  572. X    register char c;
  573. X    register char *p;
  574. X    char idbuf[20];
  575. X    int pcnt;
  576. X
  577. X    for (;;) {
  578. X        while (isspace(*lptr)) lptr++;
  579. X
  580. X        if (isdigit(c = *lptr) || c == '-' || c == '+') {
  581. X            if (c== '-' || c == '+') {
  582. X                if (c=='-') sign = -1;
  583. X                else sign = 1;
  584. X                if (!isdigit(*++lptr)) {
  585. X                    /* yylval = sign; return (NUMBER); */
  586. X                    return yylex();    /* skip the '-' sign */
  587. X                }
  588. X            } else sign = 1;
  589. X            yylval = 0;
  590. X            while (isdigit(c = *lptr++)) yylval = 10*yylval + c - '0';
  591. X            yylval *= sign;
  592. X            lptr--;
  593. X            return (NUMBER);
  594. X
  595. X        } else if (isalpha(c)) {
  596. X            p = idbuf;
  597. X            while (isalpha(c = *lptr++) || c=='.')
  598. X                *p++ = c;
  599. X            *p = '\0';
  600. X            lptr--;
  601. X            return (lookup(idbuf));
  602. X        }
  603. X
  604. X        else if (c == '(') {
  605. X            pcnt = 0;
  606. X            do {
  607. X                c = *lptr++;
  608. X                if (c == '\0') return(c);
  609. X                else if (c == '(') pcnt++;
  610. X                else if (c == ')') pcnt--;
  611. X            } while (pcnt > 0);
  612. X        }
  613. X
  614. X        else return (*lptr++);
  615. X    }
  616. X}
  617. X
  618. Xstruct table {
  619. X    char *name;
  620. X    int type, value;
  621. X};
  622. X
  623. Xstruct table mdtab[] = {
  624. X    {"January", MONTH, 1},
  625. X    {"February", MONTH, 2},
  626. X    {"March", MONTH, 3},
  627. X    {"April", MONTH, 4},
  628. X    {"May", MONTH, 5},
  629. X    {"June", MONTH, 6},
  630. X    {"July", MONTH, 7},
  631. X    {"August", MONTH, 8},
  632. X    {"September", MONTH, 9},
  633. X    {"Sept", MONTH, 9},
  634. X    {"October", MONTH, 10},
  635. X    {"November", MONTH, 11},
  636. X    {"December", MONTH, 12},
  637. X
  638. X    {"Sunday", DAY, 0},
  639. X    {"Monday", DAY, 1},
  640. X    {"Tuesday", DAY, 2},
  641. X    {"Tues", DAY, 2},
  642. X    {"Wednesday", DAY, 3},
  643. X    {"Wednes", DAY, 3},
  644. X    {"Thursday", DAY, 4},
  645. X    {"Thur", DAY, 4},
  646. X    {"Thurs", DAY, 4},
  647. X    {"Friday", DAY, 5},
  648. X    {"Saturday", DAY, 6},
  649. X    {0, 0, 0}};
  650. X
  651. X#define HRS *60
  652. X#define HALFHR 30
  653. Xstruct table mztab[] = {
  654. X    {"a.m.", MERIDIAN, AM},
  655. X    {"am", MERIDIAN, AM},
  656. X    {"p.m.", MERIDIAN, PM},
  657. X    {"pm", MERIDIAN, PM},
  658. X    {"nst", ZONE, 3 HRS + HALFHR},        /* Newfoundland */
  659. X    {"n.s.t.", ZONE, 3 HRS + HALFHR},
  660. X    {"ast", ZONE, 4 HRS},        /* Atlantic */
  661. X    {"a.s.t.", ZONE, 4 HRS},
  662. X    {"adt", DAYZONE, 4 HRS},
  663. X    {"a.d.t.", DAYZONE, 4 HRS},
  664. X    {"est", ZONE, 5 HRS},        /* Eastern */
  665. X    {"e.s.t.", ZONE, 5 HRS},
  666. X    {"edt", DAYZONE, 5 HRS},
  667. X    {"e.d.t.", DAYZONE, 5 HRS},
  668. X    {"cst", ZONE, 6 HRS},        /* Central */
  669. X    {"c.s.t.", ZONE, 6 HRS},
  670. X    {"cdt", DAYZONE, 6 HRS},
  671. X    {"c.d.t.", DAYZONE, 6 HRS},
  672. X    {"mst", ZONE, 7 HRS},        /* Mountain */
  673. X    {"m.s.t.", ZONE, 7 HRS},
  674. X    {"mdt", DAYZONE, 7 HRS},
  675. X    {"m.d.t.", DAYZONE, 7 HRS},
  676. X    {"pst", ZONE, 8 HRS},        /* Pacific */
  677. X    {"p.s.t.", ZONE, 8 HRS},
  678. X    {"pdt", DAYZONE, 8 HRS},
  679. X    {"p.d.t.", DAYZONE, 8 HRS},
  680. X    {"yst", ZONE, 9 HRS},        /* Yukon */
  681. X    {"y.s.t.", ZONE, 9 HRS},
  682. X    {"ydt", DAYZONE, 9 HRS},
  683. X    {"y.d.t.", DAYZONE, 9 HRS},
  684. X    {"hst", ZONE, 10 HRS},        /* Hawaii */
  685. X    {"h.s.t.", ZONE, 10 HRS},
  686. X    {"hdt", DAYZONE, 10 HRS},
  687. X    {"h.d.t.", DAYZONE, 10 HRS},
  688. X    {"bst", ZONE, 11 HRS},        /* Bering */
  689. X    {"b.s.t.", ZONE, 11 HRS},
  690. X    {"bdt", DAYZONE, 11 HRS},
  691. X    {"b.d.t.", DAYZONE, 11 HRS},
  692. X
  693. X    {"gmt", ZONE, 0 HRS},
  694. X    {"g.m.t.", ZONE, 0 HRS},
  695. X
  696. X    {"aest", ZONE, -10 HRS},    /* Australian Eastern Time */
  697. X    {"a.e.s.t.", ZONE, -10 HRS},
  698. X    {"aesst", DAYZONE, -10 HRS},    /* Australian Eastern Summer Time */
  699. X    {"a.e.s.s.t.", DAYZONE, -10 HRS},
  700. X    {"acst", ZONE, -(9 HRS + HALFHR)},    /* Australian Central Time */
  701. X    {"a.c.s.t.", ZONE, -(9 HRS + HALFHR)},
  702. X    {"acsst", DAYZONE, -(9 HRS + HALFHR)},    /* Australian Central Summer */
  703. X    {"a.c.s.s.t.", DAYZONE, -(9 HRS + HALFHR)},
  704. X    {"awst", ZONE, -8 HRS},        /* Australian Western Time */
  705. X    {"a.w.s.t.", ZONE, -8 HRS},    /* (no daylight time there, I'm told */
  706. X    {0, 0, 0}};
  707. X
  708. Xstruct table unittb[] = {
  709. X    {"year", MUNIT, 12},
  710. X    {"month", MUNIT, 1},
  711. X    {"fortnight", UNIT, 14*24*60},
  712. X    {"week", UNIT, 7*24*60},
  713. X    {"day", UNIT, 1*24*60},
  714. X    {"hour", UNIT, 60},
  715. X    {"minute", UNIT, 1},
  716. X    {"min", UNIT, 1},
  717. X    {"second", SUNIT, 1},
  718. X    {"sec", SUNIT, 1},
  719. X    {0, 0, 0}};
  720. X
  721. Xstruct table othertb[] = {
  722. X    {"tomorrow", UNIT, 1*24*60},
  723. X    {"yesterday", UNIT, -1*24*60},
  724. X    {"today", UNIT, 0},
  725. X    {"now", UNIT, 0},
  726. X    {"last", NUMBER, -1},
  727. X    {"this", UNIT, 0},
  728. X    {"next", NUMBER, 2},
  729. X    {"first", NUMBER, 1},
  730. X    /* {"second", NUMBER, 2}, */
  731. X    {"third", NUMBER, 3},
  732. X    {"fourth", NUMBER, 4},
  733. X    {"fifth", NUMBER, 5},
  734. X    {"sixth", NUMBER, 6},
  735. X    {"seventh", NUMBER, 7},
  736. X    {"eigth", NUMBER, 8},
  737. X    {"ninth", NUMBER, 9},
  738. X    {"tenth", NUMBER, 10},
  739. X    {"eleventh", NUMBER, 11},
  740. X    {"twelfth", NUMBER, 12},
  741. X    {"ago", AGO, 1},
  742. X    {0, 0, 0}};
  743. X
  744. Xstruct table milzone[] = {
  745. X    {"a", ZONE, 1 HRS},
  746. X    {"b", ZONE, 2 HRS},
  747. X    {"c", ZONE, 3 HRS},
  748. X    {"d", ZONE, 4 HRS},
  749. X    {"e", ZONE, 5 HRS},
  750. X    {"f", ZONE, 6 HRS},
  751. X    {"g", ZONE, 7 HRS},
  752. X    {"h", ZONE, 8 HRS},
  753. X    {"i", ZONE, 9 HRS},
  754. X    {"k", ZONE, 10 HRS},
  755. X    {"l", ZONE, 11 HRS},
  756. X    {"m", ZONE, 12 HRS},
  757. X    {"n", ZONE, -1 HRS},
  758. X    {"o", ZONE, -2 HRS},
  759. X    {"p", ZONE, -3 HRS},
  760. X    {"q", ZONE, -4 HRS},
  761. X    {"r", ZONE, -5 HRS},
  762. X    {"s", ZONE, -6 HRS},
  763. X    {"t", ZONE, -7 HRS},
  764. X    {"u", ZONE, -8 HRS},
  765. X    {"v", ZONE, -9 HRS},
  766. X    {"w", ZONE, -10 HRS},
  767. X    {"x", ZONE, -11 HRS},
  768. X    {"y", ZONE, -12 HRS},
  769. X    {"z", ZONE, 0 HRS},
  770. X    {0, 0, 0}};
  771. X
  772. Xlookup(id) char *id;
  773. X{
  774. X#define gotit (yylval=i->value,  i->type)
  775. X#define getid for(j=idvar, k=id; *j++ = *k++; )
  776. X
  777. X    char idvar[20];
  778. X    register char *j, *k;
  779. X    register struct table *i;
  780. X    int abbrev;
  781. X
  782. X    getid;
  783. X    if (strlen(idvar) == 3) abbrev = 1;
  784. X    else if (strlen(idvar) == 4 && idvar[3] == '.') {
  785. X        abbrev = 1;
  786. X        idvar[3] = '\0';
  787. X    }
  788. X    else abbrev = 0;
  789. X
  790. X    if (islower(*idvar)) *idvar = toupper(*idvar);
  791. X
  792. X    for (i = mdtab; i->name; i++) {
  793. X        k = idvar;
  794. X        for (j = i->name; *j++ == *k++;) {
  795. X            if (abbrev && j==i->name+3) return gotit;
  796. X            if (j[-1] == 0) return gotit;
  797. X        }
  798. X    }
  799. X
  800. X    getid;
  801. X    for (i = mztab; i->name; i++)
  802. X        if (strcmp(i->name, idvar) == 0) return gotit;
  803. X
  804. X    for (j = idvar; *j; j++) if (isupper(*j)) *j = tolower(*j);
  805. X    for (i=mztab; i->name; i++)
  806. X        if (strcmp(i->name, idvar) == 0) return gotit;
  807. X
  808. X    getid;
  809. X    for (i=unittb; i->name; i++)
  810. X        if (strcmp(i->name, idvar) == 0) return gotit;
  811. X
  812. X    if (idvar[strlen(idvar)-1] == 's') idvar[strlen(idvar)-1] = '\0';
  813. X    for (i=unittb; i->name; i++)
  814. X        if (strcmp(i->name, idvar) == 0) return gotit;
  815. X
  816. X    getid;
  817. X    for (i = othertb; i->name; i++)
  818. X        if (strcmp(i->name, idvar) == 0) return gotit;
  819. X
  820. X    getid;
  821. X    if (strlen(idvar) == 1 && isalpha(*idvar)) {
  822. X        if (isupper(*idvar)) *idvar = tolower(*idvar);
  823. X        for (i = milzone; i->name; i++)
  824. X            if (strcmp(i->name, idvar) == 0) return gotit;
  825. X    }
  826. X
  827. X    return(ID);
  828. X}
  829. X
  830. Xtime_t getdate(p, now) char *p; struct timeb *now;
  831. X{
  832. X#define mcheck(f)    if (f>1) err++
  833. X    time_t monthadd();
  834. X    int err;
  835. X    struct tm *lt;
  836. X    struct timeb ftz;
  837. X
  838. X    time_t sdate, tod;
  839. X
  840. X    lptr = p;
  841. X    if (now == ((struct timeb *) NULL)) {
  842. X        now = &ftz;
  843. X        ftime(&ftz);
  844. X    }
  845. X    lt = localtime(&now->time);
  846. X    year = lt->tm_year;
  847. X    month = lt->tm_mon+1;
  848. X    day = lt->tm_mday;
  849. X    relsec = 0; relmonth = 0;
  850. X    timeflag=zoneflag=dateflag=dayflag=relflag=0;
  851. X    ourzone = now->timezone;
  852. X    daylight = MAYBE;
  853. X    hh = mm = ss = 0;
  854. X    merid = 24;
  855. X
  856. X    if (err = yyparse()) return (-1);
  857. X
  858. X    mcheck(timeflag);
  859. X    mcheck(zoneflag);
  860. X    mcheck(dateflag);
  861. X    mcheck(dayflag);
  862. X
  863. X    if (err) return (-1);
  864. X
  865. X    if (dateflag || timeflag || dayflag) {
  866. X        sdate = dateconv(month,day,year,hh,mm,ss,merid,ourzone,daylight);
  867. X        if (sdate < 0) return -1;
  868. X    }
  869. X    else {
  870. X        sdate = now->time;
  871. X        if (relflag == 0)
  872. X            sdate -= (lt->tm_sec + lt->tm_min*60 +
  873. X                lt->tm_hour*(60L*60L));
  874. X    }
  875. X
  876. X    sdate += relsec;
  877. X    sdate += monthadd(sdate, relmonth);
  878. X
  879. X    if (dayflag) {
  880. X        tod = dayconv(dayord, dayreq, sdate);
  881. X        sdate += tod;
  882. X    }
  883. X
  884. X    return sdate;
  885. X}
  886. X
  887. Xyyerror(s) char *s;
  888. X{}
  889. END_OF_FILE
  890. if test 11603 -ne `wc -c <'libc/getdate.y'`; then
  891.     echo shar: \"'libc/getdate.y'\" unpacked with wrong size!
  892. fi
  893. # end of 'libc/getdate.y'
  894. fi
  895. if test -f 'rna/notes/Diffs' -a "${1}" != "-c" ; then 
  896.   echo shar: Will not clobber existing file \"'rna/notes/Diffs'\"
  897. else
  898. echo shar: Extracting \"'rna/notes/Diffs'\" \(16211 characters\)
  899. sed "s/^X//" >'rna/notes/Diffs' <<'END_OF_FILE'
  900. XFrom nuucp Sun Oct  7 04:41:24 1984
  901. X>From decvax!mulga!michaelr:elecvax  Sun Oct  7 04:28:09 1984 remote from ihnp4
  902. XFrom: ihnp4!decvax!mulga!michaelr:elecvax
  903. XReceived: by ihnp4.ATT.UUCP; id AA13572; 7 Oct 84 04:28:09 CDT (Sun)
  904. XReturn-Path: <decvax!mulga!michaelr:elecvax>
  905. XReceived: by decvax.UUCP (4.12/1.0)
  906. X    id AA19171; Sun, 7 Oct 84 04:50:18 edt
  907. XMessage-Id: <8410070850.AA19171@decvax.UUCP>
  908. XReceived: by mulga.OZ (4.3)
  909. X    id AA25613; Fri, 5 Oct 84 19:32:39 EST
  910. XDate: Fri, 5 Oct 84 18:22:05 EST
  911. XTo: ihnp4!jett!bill@decvax.UUCP:mulga
  912. XSubject: Final Update of News Software (says he hopefully)
  913. X
  914. XHere are the changes I warned you about, note that a big chunk was moved from
  915. Xreadnews.c to funcs.c. If you are now totally confused, I'll resend anything
  916. Xyou like.
  917. X
  918. XCHANGE SUMMARY (includes some changes you got in the last distribution)
  919. X
  920. X  subscription lists can be altered without editing .newsrc
  921. X    (readnews -s[+-?] [group])
  922. X  
  923. X  control commands added: "sendsys, senduuname, version"
  924. X    a response will always be sent
  925. X  
  926. X  subscription list matching is upward compatible with 2.10.2: X matches X.thing
  927. X    (X.all still matches X - I think it should)
  928. X  
  929. X  new groups aren't created automatically anymore, article is placed
  930. X    in "junk" group, and a warning issued
  931. X  
  932. X  when new groups are created, "active" gets an empty entry, but the
  933. X    existance of the directory still indicates subscription
  934. X    (regardless of "active").
  935. X
  936. X  some local mods to postnews, re default sub. lists (won't be of much use
  937. X  to you)
  938. X
  939. XI believe there should now be NO compatability problems with news 2.10.2
  940. X
  941. XDIFFS OF CHANGED FILES:
  942. X
  943. X----------
  944. Xactive.c
  945. X----------
  946. X138d137
  947. X<     extern char    *itoa();
  948. X148a148,173
  949. X>     fclose(f);
  950. X> #if !AUSAM
  951. X>     unlock(actname);
  952. X> #endif
  953. X> }
  954. X> 
  955. X> /*
  956. X>  * initgrp - initialise an entry for this group
  957. X>  */
  958. X> initgrp(group)
  959. X> char *group;
  960. X> {
  961. X>     register FILE    *f;
  962. X>     char        gbuf[BUFSIZ / 2], dbuf[BUFSIZ / 4], dbuf2[BUFSIZ / 4];
  963. X> 
  964. X>     f = fopenl(actname);
  965. X>     lineno = 0;
  966. X>     while(getline(f, gbuf, dbuf, dbuf2))
  967. X>         if(CMP(gbuf, group) == 0)
  968. X>         {
  969. X> #if !AUSAM
  970. X>             unlock(actname);
  971. X> #endif
  972. X>             return;
  973. X>         }
  974. X>     fprintf(f, "%s 00000 00001\n", group);
  975. X
  976. X----------
  977. Xdefs.h
  978. X----------
  979. X12c12
  980. X< #define NEWSVERSION     "B UNSW 1.0 3/14/84"
  981. X---
  982. X> #define NEWSVERSION     "B UNSW 1.1 19 Sep 1984"
  983. X18,19c18,19
  984. X< #define DFLTSUB "general,general.all"    /* default subscription list    */
  985. X< #define    ADMSUB    "general"        /* Mandatory subscription list */
  986. X---
  987. X> #define DFLTSUB "system,general"    /* default subscription list    */
  988. X> #define    ADMSUB    "system"        /* Mandatory subscription list */
  989. X36,37c36
  990. X< #define NETPATH    1            /* if you have path finding program
  991. X<                        /bin/netpath */
  992. X---
  993. X> #define NETPATH    "/bin/netpath"        /* if you have path finding program */
  994. X57a57,58
  995. X> #define MC    "/bin/mc"
  996. X> #define UUNAME    "ls /tmp/net ^ grep '^[a-z]'"    /* uuname program */
  997. X159,160c160,161
  998. X< char    *catstr2(), *bsearch(), *mtempnam();
  999. X< char    *getunique();
  1000. X---
  1001. X> char    *catstr2(), *bsearch(), *mtempnam(), *newstr6();
  1002. X> char    *getunique(), *getretaddr(), *getsubject();
  1003. X
  1004. X----------
  1005. Xfuncs.c
  1006. X----------
  1007. X68a69,75
  1008. X> newstr6(s1, s2, s3, s4, s5, s6)
  1009. X> char *s1, *s2, *s3, *s4, *s5, *s6;
  1010. X> {
  1011. X>     return strcat(strcat(strcat(strcat(strcat(strcpy(myalloc(strlen(s1) + strlen(s2) + strlen(s3) + strlen(s4) + strlen(s5) + strlen(s6) + 1), s1), s2), s3), s4), s5), s6);
  1012. X> }
  1013. X> 
  1014. X> char *
  1015. X89a97,98
  1016. X>  * sublist uses "all" like shell uses "*", and "." like shell uses "/"
  1017. X>  * if subscription X matches Y, it also matches Y.anything
  1018. X159c168,169
  1019. X<             return *ng2 == '\0';    /* if "\0"'s line up - match */
  1020. X---
  1021. X>             return (*ng2 == '\0' || *ng2 == '.');
  1022. X>             /* full match or X matching X.thing */
  1023. X405a416,571
  1024. X> }
  1025. X> 
  1026. X> /*
  1027. X>  * generate a return address
  1028. X>  */
  1029. X> char *
  1030. X> getretaddr(hp)
  1031. X> header *hp;
  1032. X> {
  1033. X>     register char    *ra;
  1034. X> 
  1035. X>     extern char    *getpath(), *exaddress();
  1036. X> #ifdef NETPATH
  1037. X>     extern char    *getnetpath();
  1038. X> #endif
  1039. X> 
  1040. X>     if(hp->h_replyto)
  1041. X>         ra = exaddress(hp->h_replyto);
  1042. X>     else if(hp->h_from)
  1043. X>         ra = exaddress(hp->h_from);
  1044. X>     else
  1045. X>         ra = NIL(char);
  1046. X>     if(hp->h_path && !ra)
  1047. X>         ra = getpath(hp->h_path);
  1048. X> #ifdef NETPATH
  1049. X>     if(CMPN(ra, PATHPREF, sizeof(PATHPREF) - 1) == 0)
  1050. X>         ra = getnetpath(ra);
  1051. X> #endif
  1052. X>     return ra;
  1053. X> }
  1054. X> 
  1055. X> /*
  1056. X>  * try and make a proper address
  1057. X>  */
  1058. X> char *
  1059. X> exaddress(addr)
  1060. X> char *addr;
  1061. X> {
  1062. X>     register char    *space, *dot, *at;
  1063. X>     register char    *raddr;
  1064. X> 
  1065. X>     raddr = NIL(char);
  1066. X>     if(space = strchr(addr, ' '))
  1067. X>         *space = '\0';
  1068. X>     if(at = strchr(addr, '@'))
  1069. X>     {
  1070. X>         *at = '\0';
  1071. X>         if(dot = strchr(at + 1, '.'))
  1072. X>         {
  1073. X>             *dot = '\0';
  1074. X> #if OZ
  1075. X>             if(CMP(dot + 1, MYDOMAIN) == 0)
  1076. X>                 raddr = newstr3(addr, ":", at + 1);
  1077. X>             else
  1078. X> #endif
  1079. X>                 raddr = newstr4(PATHPREF, at + 1, PSEPS, addr);
  1080. X>             *dot = '.';
  1081. X>         }
  1082. X>         *at = '@';
  1083. X>     }
  1084. X>     if(space)
  1085. X>         *space = ' ';
  1086. X>     return raddr;
  1087. X>         
  1088. X> }
  1089. X> 
  1090. X> /*
  1091. X>  * return the last two components of the path
  1092. X>  */
  1093. X> char *
  1094. X> getpath(path)
  1095. X> char *path;
  1096. X> {
  1097. X>     register char    *exlast, *ex;
  1098. X>     register char    *raddr;
  1099. X> 
  1100. X>     if(exlast = strrchr(path, PSEPCHAR))
  1101. X>     {
  1102. X>         *exlast = '\0';
  1103. X>         if(ex = strrchr(path, PSEPCHAR))
  1104. X>             raddr = newstr4(PATHPREF, ex + 1, PSEPS, exlast + 1);
  1105. X>         else
  1106. X>             raddr = newstr3(path, PSEPS, exlast + 1);
  1107. X>         *exlast = PSEPCHAR;
  1108. X>     }
  1109. X>     else
  1110. X>         raddr = NIL(char);
  1111. X>     return raddr;
  1112. X> }
  1113. X> 
  1114. X> #ifdef NETPATH
  1115. X> /*
  1116. X>  * try and work out a path from our "netpath" database
  1117. X>  */
  1118. X> char *
  1119. X> getnetpath(path)
  1120. X> char *path;
  1121. X> {
  1122. X>     FILE        *f;
  1123. X>     register char    *ex1, *ex2, *com, *new;
  1124. X>     char        buf[BUFSIZ];
  1125. X> 
  1126. X>     if((ex1 = strchr(path, PSEPCHAR))
  1127. X>     && (ex2 = strchr(ex1 + 1, PSEPCHAR)))
  1128. X>     {
  1129. X>         *ex2 = '\0';
  1130. X>         com = newstr4("exec ", NETPATH, " mulga ", ex1 + 1);
  1131. X>         if((f = popen(com, "r")) == NIL(FILE))
  1132. X>             printf("Couldn't run \"%s\"\n", com);
  1133. X>         else
  1134. X>         {
  1135. X>             fread(buf, sizeof(buf), 1, f);
  1136. X>             if(pclose(f) != 0)
  1137. X>             {
  1138. X>                 printf("Error in running \"%s\"\n", com);
  1139. X>                 fflush(stdout);
  1140. X>             }
  1141. X>             else if(CMPN(buf, "mulga!", 6) == 0)
  1142. X>             {
  1143. X>                 if(ex1 = strchr(buf, '\n'))
  1144. X>                     *ex1 = '\0';
  1145. X>                 new = newstr4(buf + 6, PSEPS, ex2 + 1, ":mulga");
  1146. X>                 free(path);
  1147. X>                 path = new;
  1148. X>             }
  1149. X>         }
  1150. X>         free(com);
  1151. X>         *ex2 = PSEPCHAR;
  1152. X>     }
  1153. X>     return path;
  1154. X> 
  1155. X> }
  1156. X> #endif
  1157. X> 
  1158. X> /*
  1159. X>  * remove extra spaces, and insert separators if necessary in
  1160. X>  * newsgroups specification
  1161. X>  */
  1162. X> convgrps(sp)
  1163. X> register char *sp;
  1164. X> {
  1165. X>     register char    *sep;
  1166. X> 
  1167. X>     sep = NIL(char);
  1168. X>     while(*sp)
  1169. X>     {
  1170. X>         if(sep)
  1171. X>             sp++;
  1172. X>         while(*sp && (isspace(*sp) || *sp == NGSEPCHAR))
  1173. X>             strcpy(sp, sp + 1);
  1174. X>         if(sep)
  1175. X>             *sep = (*sp ? NGSEPCHAR : '\0');
  1176. X>         while(*sp && !isspace(*sp) && *sp != NGSEPCHAR)
  1177. X>             sp++;
  1178. X>         sep = sp;
  1179. X>     }
  1180. X
  1181. X----------
  1182. Xnewsrc.c
  1183. X----------
  1184. X174c174,180
  1185. X<             if(ap->a_low - 1 > np->n_last)
  1186. X---
  1187. X>             /*
  1188. X>              * if we haven't read any news for a while (or at all),
  1189. X>              * or somehow seq got smaller (active corrupted?),
  1190. X>              * set last read to oldest available article
  1191. X>              */
  1192. X>             if(ap->a_low - 1 > np->n_last
  1193. X>             || ap->a_seq < np->n_last)
  1194. X
  1195. X----------
  1196. Xpostnews.c
  1197. X----------
  1198. X14a15,16
  1199. X> extern char    mydomain[];
  1200. X> extern char    newsversion[];
  1201. X19a22,24
  1202. X> #ifdef UUNAME
  1203. X> char        uuname[] = UUNAME;
  1204. X> #endif
  1205. X47a53,54
  1206. X> char        *dfltgrp();
  1207. X> extern FILE    *mailreply();
  1208. X157a165,172
  1209. X>         if(!h.h_replyto)
  1210. X>             h.h_replyto = newstr5(
  1211. X> #if AUSAM
  1212. X>                     pe.pw_strings[LNAME],
  1213. X> #else
  1214. X>                     pp->pw_name,
  1215. X> #endif
  1216. X>                     "@", systemid, ".", mydomain);
  1217. X172c187,189
  1218. X<     if(!h.h_newsgroups)
  1219. X---
  1220. X>     if(h.h_newsgroups)
  1221. X>         convgrps(h.h_newsgroups);
  1222. X>     else
  1223. X173a191,196
  1224. X>     if(h.h_distribution)
  1225. X>     {
  1226. X>         convgrps(h.h_distribution);
  1227. X>         if(CMP(h.h_newsgroups, h.h_distribution) == 0)
  1228. X>             h.h_distribution = NIL(char);
  1229. X>     }
  1230. X191c214
  1231. X<         if(applyng(h.h_newsgroups, checkng))
  1232. X---
  1233. X>         if(!cflag && applyng(h.h_newsgroups, checkng))
  1234. X208a232
  1235. X>     initgrp(grp);        /* make entry in active file */
  1236. X301c325
  1237. X<         h.h_subject = geth(t_subject, "");
  1238. X---
  1239. X>         h.h_subject = geth(t_subject, NIL(char));
  1240. X305c329
  1241. X<         h.h_newsgroups = geth(t_newsgroups, DFLTGRP);
  1242. X---
  1243. X>         h.h_newsgroups = geth(t_newsgroups, dfltgrp());
  1244. X309,314c333
  1245. X<         h.h_distribution = geth(t_distribution,
  1246. X<                     (h.h_newsgroups ? h.h_newsgroups
  1247. X<                             : DFLTGRP));
  1248. X<     if(h.h_distribution && h.h_newsgroups
  1249. X<     && CMP(h.h_distribution, h.h_newsgroups) == 0)
  1250. X<         h.h_distribution = NIL(char);
  1251. X---
  1252. X>         h.h_distribution = geth(t_distribution, h.h_newsgroups);
  1253. X332c351
  1254. X<         if(*def)
  1255. X---
  1256. X>         if(def)
  1257. X338,339c357,358
  1258. X<         if(*def)
  1259. X<             return NIL(char);
  1260. X---
  1261. X>         if(def)
  1262. X>             return newstr(def);
  1263. X379c398
  1264. X<         h.h_messageid = catstr2(h.h_messageid, MYDOMAIN, ">");
  1265. X---
  1266. X>         h.h_messageid = catstr2(h.h_messageid, mydomain, ">");
  1267. X463c482
  1268. X<     if(ccount < 5 && !pflag && !cflag)
  1269. X---
  1270. X>     if(ccount < 5 && !pflag)
  1271. X704c723
  1272. X<     register char    *s;
  1273. X---
  1274. X>     register char    *s, *com;
  1275. X716c735,738
  1276. X<             creatgroup(g);
  1277. X---
  1278. X>             com = newstr6("exec ", POSTNEWS, " -c 'newgroup ", g,
  1279. X>                  "' -n ", g);
  1280. X>             system(com);
  1281. X>             free(com);
  1282. X733a756,757
  1283. X>     static char    junk[] = "junk";
  1284. X> 
  1285. X741c765,771
  1286. X<         applyng(newg, linkng, tmpname);
  1287. X---
  1288. X>         if(!applyng(newg, linkng, tmpname))
  1289. X>         {
  1290. X>             while(!linkng(junk, tmpname))
  1291. X>                 creatgroup(junk);
  1292. X>             fprintf(stderr, "postnews: article placed in \"junk\" because no groups active from:\n\t%s\n",
  1293. X>                 newg);
  1294. X>         }
  1295. X758,764c788,791
  1296. X<     if(pflag)
  1297. X<     {
  1298. X<         dname = convg(newstr3(newsdir, "/", g));
  1299. X<         if(access(dname, 0) != 0)
  1300. X<             creatgroup(g);
  1301. X<         free(dname);
  1302. X<     }
  1303. X---
  1304. X>     dname = convg(newstr3(newsdir, "/", g));
  1305. X>     free(dname);
  1306. X>     if(access(dname, 0) != 0)
  1307. X>         return 0;        /* don't save - not an active group */
  1308. X771a799
  1309. X>     return 1;
  1310. X782a811
  1311. X>     {
  1312. X783a813,815
  1313. X>         while(*s && isspace(*s))
  1314. X>             s++;
  1315. X>     }
  1316. X784a817,819
  1317. X>     {
  1318. X>         if(!s || !*s)
  1319. X>             error("Cancel: message-id not specified.");
  1320. X785a821
  1321. X>     }
  1322. X786a823,825
  1323. X>     {
  1324. X>         if(!s || !*s)
  1325. X>             error("Newgroup: group name not specified.");
  1326. X788c827
  1327. X<             error("Permission denied.");
  1328. X---
  1329. X>             error("Newgroup: permission denied.");
  1330. X790a830,836
  1331. X>     }
  1332. X>     else if(CMP(com, "sendsys") == 0)
  1333. X>         sendsys();
  1334. X>     else if(CMP(com, "version") == 0)
  1335. X>         version();
  1336. X>     else if(CMP(com, "senduuname") == 0)
  1337. X>         senduuname();
  1338. X792,793c838,844
  1339. X<         error("Unknown control command: %s (Valid: cancel, newgroup)",
  1340. X<              com);
  1341. X---
  1342. X>     {
  1343. X>         sorry(com);
  1344. X>         error("Unknown control command: %s %s\n(Valid: cancel, newgroup, sendsys, senduuname, version)\nSent from: %s",
  1345. X>             com, s ? s : "",
  1346. X>             (h.h_replyto ? h.h_replyto
  1347. X>                      : (h.h_from ? h.h_from : "Unknown?")));
  1348. X>     }
  1349. X796a848,958
  1350. X>  * send sys file to originator
  1351. X>  */
  1352. X> sendsys()
  1353. X> {
  1354. X>     register FILE    *pp, *fp;
  1355. X>     register int    c;
  1356. X> 
  1357. X>     fp = fopenf(sys, "r");
  1358. X>     pp = mailreply("News sendsys request");
  1359. X>     while((c = getc(fp)) != EOF)
  1360. X>         putc(c, pp);
  1361. X>     mailclose(pp);
  1362. X>     fclose(fp);
  1363. X> }
  1364. X> 
  1365. X> /*
  1366. X>  * send version name and number to originator
  1367. X>  */
  1368. X> version()
  1369. X> {
  1370. X>     register FILE    *pp;
  1371. X> 
  1372. X>     pp = mailreply("News version request");
  1373. X>     fprintf(pp, "Current version: %s\n", newsversion);
  1374. X>     mailclose(pp);
  1375. X>     fclose(pp);
  1376. X> }
  1377. X> 
  1378. X> /*
  1379. X>  * send uuname data to originator
  1380. X>  */
  1381. X> senduuname()
  1382. X> {
  1383. X>     register FILE    *pp, *f;
  1384. X>     register int    c;
  1385. X> 
  1386. X>     extern FILE    *tmpfile();
  1387. X> 
  1388. X> #ifndef UUNAME
  1389. X>     sorry("uuname");
  1390. X> #else
  1391. X>     if((pp = popen(uuname, "r")) == NIL(FILE))
  1392. X>         error("Couldn't run \"%s\"", uuname);
  1393. X>     if((f = tmpfile()) == NIL(FILE))
  1394. X>         error("Can't open tmp file.");
  1395. X> 
  1396. X>     while((c = getc(pp)) != EOF)
  1397. X>         putc(c, f);
  1398. X> 
  1399. X>     if(pclose(pp) != 0)
  1400. X>         error("\"%s\" had bad exit status.", uuname);
  1401. X>     rewind(f);
  1402. X> 
  1403. X>     pp = mailreply("News senduuname request");
  1404. X>     while((c = getc(f)) != EOF)
  1405. X>         putc(c, pp);
  1406. X> 
  1407. X>     fclose(f);
  1408. X>     mailclose(pp);
  1409. X> #endif
  1410. X> }
  1411. X> 
  1412. X> 
  1413. X> /*
  1414. X>  * send message about unimplemented command
  1415. X>  */
  1416. X> sorry(com)
  1417. X> char *com;
  1418. X> {
  1419. X>     register FILE    *pp;
  1420. X> 
  1421. X>     pp = mailreply("Unimplemented news control message");
  1422. X>     fprintf(pp, "The control message \"%s\" is not implemented at this site.\n", com);
  1423. X>     fprintf(pp, "Our current version of news is: %s\n", newsversion);
  1424. X>     mailclose(pp);
  1425. X>     fclose(pp);
  1426. X> }
  1427. X> 
  1428. X> /*
  1429. X>  * set up a pipe to a mail program to reply to control requests
  1430. X>  */
  1431. X> FILE *
  1432. X> mailreply(s)
  1433. X> char *s;
  1434. X> {
  1435. X>     register FILE    *pp;
  1436. X>     register char    *com, *ra;
  1437. X> 
  1438. X>     if((ra = getretaddr(&h)) == NIL(char))
  1439. X>         error("Can't form return address for control message");
  1440. X>     com = newstr4("exec ", MAIL, " ", ra);
  1441. X>     if((pp = popen(com, "w")) == NIL(FILE))
  1442. X>         error("Couldn't run \"%s\"", com);
  1443. X>     fprintf(pp, "Subject: %s\n", s);
  1444. X>     fprintf(pp, "Responding-system: %s.%s\n\n", systemid, mydomain);
  1445. X>     free(com);
  1446. X>     free(ra);
  1447. X>     return pp;
  1448. X> }
  1449. X> 
  1450. X> /*
  1451. X>  * close the mail pipe
  1452. X>  */
  1453. X> mailclose(pp)
  1454. X> FILE *pp;
  1455. X> {
  1456. X>     if(pclose(pp) != 0)
  1457. X>         error("Mail reply for control message failed");
  1458. X> }
  1459. X> 
  1460. X> /*
  1461. X844a1007,1031
  1462. X> }
  1463. X> 
  1464. X> /*
  1465. X>  * work out the default group for this user
  1466. X>  */
  1467. X> char *
  1468. X> dfltgrp()
  1469. X> {
  1470. X> #if MANGRPS
  1471. X>     register char    **sp;
  1472. X>     extern char    **getclasses();
  1473. X> 
  1474. X>     for(sp = getclasses(pe.pw_cmask); *sp; sp++)
  1475. X>     {
  1476. X>         if(CMP(*sp, "C-Staff") == 0 || CMP(*sp, "System") == 0)
  1477. X>             return "system";
  1478. X>         if(CMP(*sp, "CLUBS") == 0)
  1479. X>             return newstr2("general.club.", pe.pw_strings[LNAME]);
  1480. X>         if(CMP(*sp, "Languages") == 0)
  1481. X>             return newstr2("general.lang.", pe.pw_strings[LNAME]);
  1482. X>         if(CMP(*sp, "Classaccount") == 0)
  1483. X>             return newstr2("class.", pe.pw_strings[LNAME]);
  1484. X>     }
  1485. X> #endif
  1486. X>     return DFLTGRP;
  1487. X
  1488. X----------
  1489. Xreadnews.c
  1490. X----------
  1491. X63,65d62
  1492. X< char        *getnetpath();
  1493. X< char        *getsubject(), *exaddress(), *getpath();
  1494. X< 
  1495. X112c109,111
  1496. X<     if(!nflag)
  1497. X---
  1498. X>     if(nflag)
  1499. X>         convgrps(nflag);
  1500. X>     else
  1501. X113a113,114
  1502. X>     if(rcgrps)
  1503. X>         convgrps(rcgrps);
  1504. X318c319
  1505. X<     register char    *tmp;
  1506. X---
  1507. X>     register char    *tmp, *com;
  1508. X325c326,327
  1509. X<         if((f = popen("exec /bin/mc", "w")) == NULL)
  1510. X---
  1511. X>         com = newstr2("exec ", MC);
  1512. X>         if((f = popen(com, "w")) == NULL)
  1513. X326a329
  1514. X>         free(com);
  1515. X1057,1069c1060
  1516. X<     if(hp->h_replyto)
  1517. X<         argv[argc++] = exaddress(hp->h_replyto);
  1518. X<     else if(hp->h_from)
  1519. X<         argv[argc++] = exaddress(hp->h_from);
  1520. X<     else
  1521. X<         argv[argc++] = NIL(char);
  1522. X<     if(hp->h_path && !argv[argc - 1])
  1523. X<         argv[argc - 1] = getpath(hp->h_path);
  1524. X< #if NETPATH
  1525. X<     if(CMPN(argv[argc - 1], PATHPREF, sizeof(PATHPREF) - 1) == 0)
  1526. X<         argv[argc - 1] = getnetpath(argv[argc - 1]);
  1527. X< #endif
  1528. X<     if(!argv[argc - 1])
  1529. X---
  1530. X>     if((argv[argc++] = getretaddr(hp)) == NIL(char))
  1531. X1105,1208d1095
  1532. X< 
  1533. X< /*
  1534. X<  * try and make a proper address
  1535. X<  */
  1536. X< char *
  1537. X< exaddress(addr)
  1538. X< char *addr;
  1539. X< {
  1540. X<     register char    *space, *dot, *at;
  1541. X<     register char    *raddr;
  1542. X< 
  1543. X<     raddr = NIL(char);
  1544. X<     if(space = strchr(addr, ' '))
  1545. X<         *space = '\0';
  1546. X<     if(at = strchr(addr, '@'))
  1547. X<     {
  1548. X<         *at = '\0';
  1549. X<         if(dot = strchr(at + 1, '.'))
  1550. X<         {
  1551. X<             *dot = '\0';
  1552. X< #if OZ
  1553. X<             if(CMP(dot + 1, "SUN") == 0    /* compatability */
  1554. X<             || CMP(dot + 1, "OZ") == 0)
  1555. X<                 raddr = newstr3(addr, ":", at + 1);
  1556. X<             else
  1557. X< #endif
  1558. X<                 raddr = newstr4(PATHPREF, at + 1, PSEPS, addr);
  1559. X<             *dot = '.';
  1560. X<         }
  1561. X<         *at = '@';
  1562. X<     }
  1563. X<     if(space)
  1564. X<         *space = ' ';
  1565. X<     return raddr;
  1566. X<         
  1567. X< }
  1568. X< 
  1569. X< /*
  1570. X<  * return the last two components of the path
  1571. X<  */
  1572. X< char *
  1573. X< getpath(path)
  1574. X< char *path;
  1575. X< {
  1576. X<     register char    *exlast, *ex;
  1577. X<     register char    *raddr;
  1578. X< 
  1579. X<     if(exlast = strrchr(path, PSEPCHAR))
  1580. X<     {
  1581. X<         *exlast = '\0';
  1582. X<         if(ex = strrchr(path, PSEPCHAR))
  1583. X<             raddr = newstr4(PATHPREF, ex + 1, PSEPS, exlast + 1);
  1584. X<         else
  1585. X<             raddr = newstr3(path, PSEPS, exlast + 1);
  1586. X<         *exlast = PSEPCHAR;
  1587. X<     }
  1588. X<     else
  1589. X<         raddr = NIL(char);
  1590. X<     return raddr;
  1591. X< }
  1592. X< 
  1593. X< #if NETPATH
  1594. X< /*
  1595. X<  * try and work out a path from our "netpath" database
  1596. X<  */
  1597. X< char *
  1598. X< getnetpath(path)
  1599. X< char *path;
  1600. X< {
  1601. X<     FILE        *f;
  1602. X<     register char    *ex1, *ex2, *com, *new;
  1603. X<     char        buf[BUFSIZ];
  1604. X< 
  1605. X<     if((ex1 = strchr(path, PSEPCHAR))
  1606. X<     && (ex2 = strchr(ex1 + 1, PSEPCHAR)))
  1607. X<     {
  1608. X<         *ex2 = '\0';
  1609. X<         com = newstr2("exec /bin/netpath mulga ", ex1 + 1);
  1610. X<         if((f = popen(com, "r")) == NIL(FILE))
  1611. X<             printf("Couldn't run \"%s\"\n", com);
  1612. X<         else
  1613. X<         {
  1614. X<             fread(buf, sizeof(buf), 1, f);
  1615. X<             if(pclose(f) != 0)
  1616. X<             {
  1617. X<                 printf("Error in running \"%s\"\n", com);
  1618. X<                 fflush(stdout);
  1619. X<             }
  1620. X<             else if(CMPN(buf, "mulga!", 6) == 0)
  1621. X<             {
  1622. X<                 if(ex1 = strchr(buf, '\n'))
  1623. X<                     *ex1 = '\0';
  1624. X<                 new = newstr4(buf + 6, PSEPS, ex2 + 1, ":mulga");
  1625. X<                 free(path);
  1626. X<                 path = new;
  1627. X<             }
  1628. X<         }
  1629. X<         free(com);
  1630. X<         *ex2 = PSEPCHAR;
  1631. X<     }
  1632. X<     return path;
  1633. X< 
  1634. X< }
  1635. X< #endif
  1636. X
  1637. XTHE END!
  1638. X
  1639. XHopefully you won't see any more of this!
  1640. XPlease tell me if you have any problems.
  1641. X
  1642. XMichael
  1643. END_OF_FILE
  1644. if test 16211 -ne `wc -c <'rna/notes/Diffs'`; then
  1645.     echo shar: \"'rna/notes/Diffs'\" unpacked with wrong size!
  1646. fi
  1647. # end of 'rna/notes/Diffs'
  1648. fi
  1649. echo shar: End of archive 11 \(of 14\).
  1650. ##  End of shell archive.
  1651. exit 0
  1652.