Advertisement
Guest User

Untitled

a guest
May 27th, 2017
546
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 59.33 KB | None | 0 0
  1.  
  2.  
  3.  
  4.  
  5. /* This file has been generated by the Hex-Rays decompiler.
  6.  
  7.    Copyright (c) 2009 Hex-Rays <info@hex-rays.com>
  8.  
  9.  
  10.  
  11.    Detected compiler: GNU C++
  12.  
  13. */
  14.  
  15.  
  16.  
  17. #include <defs.h>
  18.  
  19.  
  20.  
  21. #include <stdarg.h>
  22.  
  23.  
  24.  
  25.  
  26.  
  27. //-------------------------------------------------------------------------
  28.  
  29. // Data declarations
  30.  
  31.  
  32.  
  33. extern _UNKNOWN start; // weak
  34.  
  35. extern char format[]; // idb
  36.  
  37. extern char aUnableToCreate[]; // idb
  38.  
  39. extern char aUnableToSetReu[]; // idb
  40.  
  41. extern char aUnableToBindSo[]; // idb
  42.  
  43. extern char aUnableToListen[]; // idb
  44.  
  45. extern char aFailedToFindUs[]; // idb
  46.  
  47. extern char aDrop_privsFail[]; // idb
  48.  
  49. extern char aSetgidCurrentG[]; // idb
  50.  
  51. extern char aSetgidCurrentU[]; // idb
  52.  
  53. extern char a02x[]; // idb
  54.  
  55. extern char aS[]; // idb
  56.  
  57. extern char modes[]; // idb
  58.  
  59. extern char aSCanTBeOpened_[]; // idb
  60.  
  61. extern char aS_0[]; // idb
  62.  
  63. extern char aNodeX[]; // idb
  64.  
  65. extern char aChickensU[]; // idb
  66.  
  67. extern char aEggsU[]; // idb
  68.  
  69. extern char aMoniesU[]; // idb
  70.  
  71. extern char aIdU[]; // idb
  72.  
  73. extern char aUsernameS[]; // idb
  74.  
  75. extern char aInfoS[]; // idb
  76.  
  77. extern char aOfficeS[]; // idb
  78.  
  79. extern char aPasswordS[]; // idb
  80.  
  81. extern char aPermU[]; // idb
  82.  
  83. extern char aNextX[]; // idb
  84.  
  85. extern char aPrevX[]; // idb
  86.  
  87. extern char aLcggedIn[]; // idb
  88.  
  89. extern char s[]; // idb
  90.  
  91. extern char aEnterNewUserna[]; // idb
  92.  
  93. extern char aEnterNewInfo[]; // idb
  94.  
  95. extern char aEnterNewOffice[]; // idb
  96.  
  97. extern char aEnterNewPass[]; // idb
  98.  
  99. extern char aInsertFailed_[]; // idb
  100.  
  101. extern char aYouCurrentlyHa[]; // idb
  102.  
  103. extern char aMarketPriceFor[]; // idb
  104.  
  105. extern char aWouldYouLikeTo[]; // idb
  106.  
  107. extern char aHowMany_[]; // idb
  108.  
  109. extern char aUSold[]; // idb
  110.  
  111. extern char aNotEnoughEggs[]; // idb
  112.  
  113. extern char aYouCurrently_0[]; // idb
  114.  
  115. extern char aWouldYouLike_0[]; // idb
  116.  
  117. extern char aHowMuch_[]; // idb
  118.  
  119. extern char aUBurntToACrisp[]; // idb
  120.  
  121. extern char aOhSnapItSAllGo[]; // idb
  122.  
  123. extern char aYouCurrently_1[]; // idb
  124.  
  125. extern char aMarketPriceF_0[]; // idb
  126.  
  127. extern char aWouldYouLike_1[]; // idb
  128.  
  129. extern char aUPurchased[]; // idb
  130.  
  131. extern char aNotEnoughMoney[]; // idb
  132.  
  133. extern char aWouldYouLike_2[]; // idb
  134.  
  135. extern char aWouldYouLike_3[]; // idb
  136.  
  137. extern char aWouldYouLike_4[]; // idb
  138.  
  139. extern char aWouldYouLike_5[]; // idb
  140.  
  141. extern char aWouldYouLike_6[]; // idb
  142.  
  143. extern char aEnterNewUid[]; // idb
  144.  
  145. extern char aWouldYouLike_7[]; // idb
  146.  
  147. extern char aEnterNewEggCou[]; // idb
  148.  
  149. extern char aYouDonTHaveEno[]; // idb
  150.  
  151. extern char aWouldYouLike_8[]; // idb
  152.  
  153. extern char aEnterNewChicke[]; // idb
  154.  
  155. extern char aYouDonTHaveE_0[]; // idb
  156.  
  157. extern char aWouldYouLike_9[]; // idb
  158.  
  159. extern char aEnterNewMonies[]; // idb
  160.  
  161. extern char aYouDonTHaveE_1[]; // idb
  162.  
  163. extern char aWouldYouLik_10[]; // idb
  164.  
  165. extern char aEnterNewPerm[]; // idb
  166.  
  167. extern char aYouDonTHaveE_2[]; // idb
  168.  
  169. extern char aFinishedUpdate[]; // idb
  170.  
  171. extern char aEnterUsername[]; // idb
  172.  
  173. extern char aEnterPassword[]; // idb
  174.  
  175. extern char aBadUsernameOrP[]; // idb
  176.  
  177. extern char aFantasyChicken[]; // idb
  178.  
  179. extern char aMenuS[]; // idb
  180.  
  181. extern char aLLogout[]; // idb
  182.  
  183. extern char aBBuyChickens[]; // idb
  184.  
  185. extern char aIIncinerateMon[]; // idb
  186.  
  187. extern char aSSellEggs[]; // idb
  188.  
  189. extern char aPDisplayMyInfo[]; // idb
  190.  
  191. extern char aUUpdateMyInfo[]; // idb
  192.  
  193. extern char aPPrintUserlist[]; // idb
  194.  
  195. extern char aMenu[]; // idb
  196.  
  197. extern char aCCreateAccount[]; // idb
  198.  
  199. extern char aLLogin[]; // idb
  200.  
  201. extern char aQQuit[]; // idb
  202.  
  203. extern char s2[]; // idb
  204.  
  205. extern char aUser[]; // idb
  206.  
  207. extern char aAttemptedS_[]; // idb
  208.  
  209. extern char aCya[]; // idb
  210.  
  211. extern char aCanTAllocateUs[]; // idb
  212.  
  213. extern char aHomeFcflUser_d[]; // idb
  214.  
  215. extern char aCanTReadUserDb[]; // idb
  216.  
  217. extern char aDS[]; // idb
  218.  
  219. extern char aThatSNotAValid[]; // idb
  220.  
  221. extern char aC[2]; // weak
  222.  
  223. extern char asc_804D115[2]; // weak
  224.  
  225. extern char aS_1[2]; // weak
  226.  
  227. extern char aI[2]; // weak
  228.  
  229. extern char aB[2]; // weak
  230.  
  231. extern char aU[2]; // weak
  232.  
  233. extern char aP[2]; // weak
  234.  
  235. extern char asc_804D121[2]; // weak
  236.  
  237. extern char aP_0[2]; // weak
  238.  
  239. extern char a6[2]; // '6'
  240.  
  241. extern char filename[]; // idb
  242.  
  243. extern char aQ[2]; // weak
  244.  
  245. extern int dword_804E1D8; // weak
  246.  
  247. extern int dword_804E1E0[]; // weak
  248.  
  249. extern _UNKNOWN unk_804E1E4; // weak
  250.  
  251. extern int dword_804E1E8; // weak
  252.  
  253. extern _UNKNOWN unk_804E3C0; // weak
  254.  
  255. extern __int16 word_804E404; // weak
  256.  
  257. extern char name[]; // idb
  258.  
  259. extern char chickenprice[]; // idb
  260.  
  261. extern char eggprice[]; // idb
  262.  
  263. extern char byte_804E418; // weak
  264.  
  265. extern int dword_804E41C; // weak
  266.  
  267. extern int admin; // weak
  268.  
  269. extern int logged_in; // weak
  270.  
  271. extern char s1; // idb
  272.  
  273. // extern _UNKNOWN _gmon_start__; weak
  274.  
  275.  
  276.  
  277. //-------------------------------------------------------------------------
  278.  
  279. // Function declarations
  280.  
  281.  
  282.  
  283. int __cdecl init_proc();
  284.  
  285. int sprintf(char *s, const char *format, ...);
  286.  
  287. void srand(unsigned int seed);
  288.  
  289. void err(int status, const char *format, ...);
  290.  
  291. __sighandler_t signal(int sig, __sighandler_t handler);
  292.  
  293. int __gmon_start__(void); // weak
  294.  
  295. char *strncpy(char *dest, const char *src, size_t n);
  296.  
  297. int listen(int fd, int n);
  298.  
  299. void *memset(void *s, int c, size_t n);
  300.  
  301. uint16_t htons(uint16_t hostshort);
  302.  
  303. int setegid(__gid_t gid);
  304.  
  305. __pid_t wait4(__pid_t pid, void *stat_loc, int options, struct rusage *usage);
  306.  
  307. ssize_t read(int fd, void *buf, size_t nbytes);
  308.  
  309. int __cdecl setresuid(_DWORD, _DWORD); // weak
  310.  
  311. int __cdecl setresgid(_DWORD, _DWORD); // weak
  312.  
  313. int accept(int fd, struct sockaddr *addr, socklen_t *addr_len);
  314.  
  315. int socket(int domain, int type, int protocol);
  316.  
  317. int fclose(FILE *stream);
  318.  
  319. int setuid(__uid_t uid);
  320.  
  321. size_t strlen(const char *s);
  322.  
  323. FILE *fopen(const char *filename, const char *modes);
  324.  
  325. char *strcpy(char *dest, const char *src);
  326.  
  327. __gid_t getegid(void);
  328.  
  329. int printf(const char *format, ...);
  330.  
  331. int chdir(const char *path);
  332.  
  333. int bind(int fd, const struct sockaddr *addr, socklen_t len);
  334.  
  335. __uid_t getuid(void);
  336.  
  337. int atoi(const char *nptr);
  338.  
  339. int close(int fd);
  340.  
  341. int initgroups(const char *, __gid_t group);
  342.  
  343. time_t time(time_t *timer);
  344.  
  345. void *malloc(size_t size);
  346.  
  347. char *strcat(char *dest, const char *src);
  348.  
  349. ssize_t send(int fd, const void *buf, size_t n, int flags);
  350.  
  351. int vasprintf(char **, const char *, va_list);
  352.  
  353. __pid_t fork(void);
  354.  
  355. int setsockopt(int fd, int level, int optname, const void *optval, socklen_t optlen);
  356.  
  357. int rand(void);
  358.  
  359. void bzero(void *s, size_t n);
  360.  
  361. int strncmp(const char *s1, const char *s2, size_t n);
  362.  
  363. size_t fread(void *ptr, size_t size, size_t n, FILE *stream);
  364.  
  365. int seteuid(__uid_t uid);
  366.  
  367. int setgid(__gid_t gid);
  368.  
  369. struct passwd *getpwnam(const char *name);
  370.  
  371. int strcmp(const char *s1, const char *s2);
  372.  
  373. void exit(int status);
  374.  
  375. __gid_t getgid(void);
  376.  
  377. __uid_t geteuid(void);
  378.  
  379. void __cdecl sub_8048CB0();
  380.  
  381. int __cdecl sub_8048D10();
  382.  
  383. int __cdecl sub_8048D34();
  384.  
  385. __pid_t __cdecl handler();
  386.  
  387. int __cdecl read_x_bytes_or_til_escape_char(int fd, int a2, unsigned int a3, char a4);
  388.  
  389. signed int __cdecl send_with_or_without_null(int fd, const char *s, int a3);
  390.  
  391. signed int __cdecl send_data(int fd, int a2, unsigned int a3);
  392.  
  393. int write_string(int fd, const char *a2, ...);
  394.  
  395. int __cdecl sub_8048F7A(uint16_t a1);
  396.  
  397. void __cdecl sub_80490D0(int fd, int (__cdecl *a2)(_DWORD));
  398.  
  399. int __cdecl sub_804915E(const char *name);
  400.  
  401. int __cdecl sub_80491BE(int a1);
  402.  
  403. int __cdecl fill_head_with_madness(int a1);
  404.  
  405. char __cdecl sub_804939E(int a1, int a2, unsigned int a3);
  406.  
  407. int __cdecl sub_80494D4(int a1);
  408.  
  409. int __cdecl sub_8049649(int a1, int a2);
  410.  
  411. int __cdecl sub_804A296(int a1);
  412.  
  413. int __cdecl sub_804A3DC(const char *s);
  414.  
  415. int __cdecl sub_804A443(const char *filename);
  416.  
  417. char *__cdecl sub_804A60A(int a1, char *dest);
  418.  
  419. char *__cdecl (const char *s, char *dest);
  420.  
  421. int __cdecl print_user(int fd, int a2);
  422.  
  423. int __cdecl print_all_users(int fd, int); // idb
  424.  
  425. int __cdecl print_current_user(int fd, int); // idb
  426.  
  427. int __cdecl check_username_n_pass(int fd, char *a2, const char *s1, const char *s);
  428.  
  429. void __cdecl log_out();
  430.  
  431. signed int __cdecl user_exists(int a1, const char *s2);
  432.  
  433. int __cdecl read_yes_or_no(int fd, int); // idb
  434.  
  435. signed int __cdecl create_user(int fd, const char *s, int a3);
  436.  
  437. int __cdecl buy_eggs(int fd, const char *nptr, int a3);
  438.  
  439. int __cdecl burn_money(int fd, const char *nptr, int a3);
  440.  
  441. int __cdecl buy_chickens(int fd, const char *nptr, int a3);
  442.  
  443. int __cdecl change_info(int fd, const char *nptr, int a3);
  444.  
  445. int __cdecl try_login(int fd, int s1, char *a3);
  446.  
  447. int __cdecl print_menu(int fd); // idb
  448.  
  449. int __cdecl readfromfd(FILE *stream, int a2, unsigned int a3, char a4);
  450.  
  451. void *__cdecl allocandfillstruct(int a1, int a2, const char *src, const char *a4, const char *a5, const char *a6, int a7, int a8, int a9, int a10, int a11);
  452.  
  453. signed int __cdecl opendbandinit(const char *filename, int a2, int fd);
  454.  
  455. void __cdecl quit(int fd);
  456.  
  457. int __cdecl newprices(int a1);
  458.  
  459. void __cdecl sub_804C18B(int fd);
  460.  
  461. void __cdecl sub_804C5F0();
  462.  
  463. int *__cdecl sub_804C600();
  464.  
  465. void __cdecl sub_804C65A();
  466.  
  467. void (*__cdecl sub_804C660())(void);
  468.  
  469. void __cdecl term_proc();
  470.  
  471.  
  472.  
  473.  
  474.  
  475. //----- (08048900) --------------------------------------------------------
  476.  
  477. int __cdecl init_proc()
  478.  
  479. {
  480.  
  481.   int v1; // ST04_4@3
  482.  
  483.  
  484.  
  485.   if ( &_gmon_start__ )
  486.  
  487.     __gmon_start__();
  488.  
  489.   sub_8048D10();
  490.  
  491.   sub_804C660();
  492.  
  493.   return v1;
  494.  
  495. }
  496.  
  497. // 8048980: using guessed type int __gmon_start__(void);
  498.  
  499.  
  500.  
  501. //----- (08048C80) --------------------------------------------------------
  502.  
  503. #error "8048C83: positive sp value has been found (funcsize=2)"
  504.  
  505.  
  506.  
  507. //----- (08048CB0) --------------------------------------------------------
  508.  
  509. void __cdecl sub_8048CB0()
  510.  
  511. {
  512.  
  513.   int v0; // eax@2
  514.  
  515.   int i; // ebx@2
  516.  
  517.  
  518.  
  519.   if ( !byte_804E418 )
  520.  
  521.   {
  522.  
  523.     v0 = dword_804E41C;
  524.  
  525.     for ( i = ((signed int)(&unk_804E1E4 - (_UNKNOWN *)dword_804E1E0) >> 2) - 1;
  526.  
  527.           dword_804E41C < (unsigned int)i;
  528.  
  529.           v0 = dword_804E41C )
  530.  
  531.     {
  532.  
  533.       dword_804E41C = v0 + 1;
  534.  
  535.       ((void (*)(void))dword_804E1E0[dword_804E41C])();
  536.  
  537.     }
  538.  
  539.     byte_804E418 = 1;
  540.  
  541.   }
  542.  
  543. }
  544.  
  545. // 804E1E0: using guessed type int dword_804E1E0[];
  546.  
  547. // 804E418: using guessed type char byte_804E418;
  548.  
  549. // 804E41C: using guessed type int dword_804E41C;
  550.  
  551.  
  552.  
  553. //----- (08048D10) --------------------------------------------------------
  554.  
  555. int __cdecl sub_8048D10()
  556.  
  557. {
  558.  
  559.   int result; // eax@1
  560.  
  561.  
  562.  
  563.   result = dword_804E1E8;
  564.  
  565.   if ( dword_804E1E8 )
  566.  
  567.     result = 0;
  568.  
  569.   return result;
  570.  
  571. }
  572.  
  573. // 804E1E8: using guessed type int dword_804E1E8;
  574.  
  575.  
  576.  
  577. //----- (08048D34) --------------------------------------------------------
  578.  
  579. int __cdecl sub_8048D34()
  580.  
  581. {
  582.  
  583.   int v1; // ST1C_4@1
  584.  
  585.  
  586.  
  587.   v1 = sub_8048F7A(word_804E404);
  588.  
  589.   sub_804915E("fcfl");
  590.  
  591.   sub_80490D0(v1, (int (__cdecl *)(_DWORD))sub_804C18B);
  592.  
  593.   return 0;
  594.  
  595. }
  596.  
  597. // 804E404: using guessed type __int16 word_804E404;
  598.  
  599.  
  600.  
  601. //----- (08048D78) --------------------------------------------------------
  602.  
  603. __pid_t __cdecl handler()
  604.  
  605. {
  606.  
  607.   __pid_t result; // eax@1
  608.  
  609.   char stat_loc; // [sp+1Ch] [bp-Ch]@1
  610.  
  611.  
  612.  
  613.   do
  614.  
  615.     result = wait4(-1, &stat_loc, 1, 0);
  616.  
  617.   while ( result > 0 );
  618.  
  619.   return result;
  620.  
  621. }
  622.  
  623.  
  624.  
  625. //----- (08048E0A) --------------------------------------------------------
  626.  
  627. int __cdecl read_x_bytes_or_til_escape_char(int fd, int a2, unsigned int a3, char a4)
  628.  
  629. {
  630.  
  631.   char buf; // [sp+2Bh] [bp-Dh]@2
  632.  
  633.   unsigned int i; // [sp+2Ch] [bp-Ch]@1
  634.  
  635.  
  636.  
  637.   for ( i = 0; ; ++i )
  638.  
  639.   {
  640.  
  641.     if ( read(fd, &buf, 1u) <= 0 )
  642.  
  643.       return -1;
  644.  
  645.     if ( buf == a4 )
  646.  
  647.       return i;
  648.  
  649.     if ( i >= a3 )
  650.  
  651.       break;
  652.  
  653.     *(_BYTE *)(i + a2) = buf;
  654.  
  655.   }
  656.  
  657.   return -1;
  658.  
  659. }
  660.  
  661.  
  662.  
  663. //----- (08048E75) --------------------------------------------------------
  664.  
  665. signed int __cdecl send_with_or_without_null(int fd, const char *string, bool sendnull)
  666.  
  667. {
  668.  
  669.   unsigned int len; // eax@2
  670.  
  671.   size_t strlen; // [sp+1Ch] [bp-Ch]@1
  672.  
  673.  
  674.  
  675.   strlen = strlen(string);
  676.  
  677.   if (  sendnull )
  678.  
  679.     len = strlen + 1;
  680.  
  681.   else
  682.  
  683.     len = strlen;
  684.  
  685.   return send_data(fd, string, len);
  686.  
  687. }
  688.  
  689.  
  690.  
  691. //----- (08048EB2) --------------------------------------------------------
  692.  
  693. signed int __cdecl send_data(int fd, int a2, unsigned int a3)
  694.  
  695. {
  696.  
  697.   unsigned int i; // [sp+18h] [bp-10h]@1
  698.  
  699.   ssize_t v5; // [sp+1Ch] [bp-Ch]@2
  700.  
  701.  
  702.  
  703.   for ( i = 0; i < a3; i += v5 )
  704.  
  705.   {
  706.  
  707.     v5 = send(fd, (const void *)(a2 + i), a3 - i, 0);
  708.  
  709.     if ( !v5 )
  710.  
  711.       return -1;
  712.  
  713.   }
  714.  
  715.   return i;
  716.  
  717. }
  718.  
  719.  
  720.  
  721. //----- (08048F10) --------------------------------------------------------
  722.  
  723. int write_string(int fd, const char *a2, ...)
  724.  
  725. {
  726.  
  727.   char *s; // [sp+18h] [bp-10h]@1
  728.  
  729.   int v4; // [sp+1Ch] [bp-Ch]@1
  730.  
  731.   va_list va; // [sp+38h] [bp+10h]@1
  732.  
  733.  
  734.  
  735.   va_start(va, a2);
  736.  
  737.   v4 = 0;
  738.  
  739.   s = 0;
  740.  
  741.   if ( vasprintf(&s, a2, va) != -1 && s )
  742.  
  743.     v4 = send_with_or_without_null(fd, s, 0);
  744.  
  745.   else
  746.  
  747.     v4 = -1;
  748.  
  749.   return v4;
  750.  
  751. }
  752.  
  753.  
  754.  
  755. //----- (08048F7A) --------------------------------------------------------
  756.  
  757. int __cdecl sub_8048F7A(uint16_t a1)
  758.  
  759. {
  760.  
  761.   int optval; // [sp+2Ch] [bp-ACh]@1
  762.  
  763.   __int16 s; // [sp+BCh] [bp-1Ch]@1
  764.  
  765.   uint16_t v4; // [sp+BEh] [bp-1Ah]@1
  766.  
  767.   int fd; // [sp+CCh] [bp-Ch]@3
  768.  
  769.  
  770.  
  771.   optval = 1;
  772.  
  773.   memset(&s, 0, 0x10u);
  774.  
  775.   s = 2;
  776.  
  777.   v4 = htons(a1);
  778.  
  779.   if ( signal(17, (__sighandler_t)handler) == (__sighandler_t)-1 )
  780.  
  781.     err(-1, "Unable to set SIGCHLD handler");
  782.  
  783.   fd = socket(2, 1, 0);
  784.  
  785.   if ( fd == -1 )
  786.  
  787.     err(-1, "Unable to create socket");
  788.  
  789.   if ( setsockopt(fd, 1, 2, &optval, 4u) == -1 )
  790.  
  791.     err(-1, "Unable to set reuse");
  792.  
  793.   if ( bind(fd, (const struct sockaddr *)&s, 0x10u) == -1 )
  794.  
  795.     err(-1, "Unable to bind socket");
  796.  
  797.   if ( listen(fd, 20) == -1 )
  798.  
  799.     err(-1, "Unable to listen on socket");
  800.  
  801.   return fd;
  802.  
  803. }
  804.  
  805.  
  806.  
  807. //----- (080490D0) --------------------------------------------------------
  808.  
  809. void __cdecl sub_80490D0(int fd, int (__cdecl *a2)(_DWORD))
  810.  
  811. {
  812.  
  813.   socklen_t addr_len; // [sp+1Ch] [bp-2Ch]@2
  814.  
  815.   struct sockaddr addr; // [sp+20h] [bp-28h]@2
  816.  
  817.   int v4; // [sp+30h] [bp-18h]@1
  818.  
  819.   int v5; // [sp+34h] [bp-14h]@2
  820.  
  821.   int v6; // [sp+38h] [bp-10h]@3
  822.  
  823.   int status; // [sp+3Ch] [bp-Ch]@5
  824.  
  825.  
  826.  
  827.   v4 = 1;
  828.  
  829.   while ( v4 )
  830.  
  831.   {
  832.  
  833.     addr_len = 16;
  834.  
  835.     v5 = accept(fd, &addr, &addr_len);
  836.  
  837.     if ( v5 != -1 )
  838.  
  839.     {
  840.  
  841.       v6 = fork();
  842.  
  843.       if ( v6 != -1 )
  844.  
  845.       {
  846.  
  847.         if ( !v6 )
  848.  
  849.         {
  850.  
  851.           close(fd);
  852.  
  853.           status = a2(v5);
  854.  
  855.           close(v5);
  856.  
  857.           exit(status);
  858.  
  859.         }
  860.  
  861.         close(v5);
  862.  
  863.       }
  864.  
  865.     }
  866.  
  867.   }
  868.  
  869. }
  870.  
  871.  
  872.  
  873. //----- (0804915E) --------------------------------------------------------
  874.  
  875. int __cdecl sub_804915E(const char *name)
  876.  
  877. {
  878.  
  879.   int v2; // [sp+1Ch] [bp-Ch]@1
  880.  
  881.  
  882.  
  883.   v2 = (int)getpwnam(name);
  884.  
  885.   if ( !v2 )
  886.  
  887.     err(-1, "Failed to find user %s\n", name);
  888.  
  889.   if ( sub_80491BE(v2) == -1 )
  890.  
  891.     err(-1, "drop_privs failed!\n");
  892.  
  893.   return 0;
  894.  
  895. }
  896.  
  897.  
  898.  
  899. //----- (080491BE) --------------------------------------------------------
  900.  
  901. int __cdecl sub_80491BE(int a1)
  902.  
  903. {
  904.  
  905.   int result; // eax@2
  906.  
  907.   int v2; // ebx@8
  908.  
  909.   __gid_t v3; // eax@8
  910.  
  911.   int v4; // ebx@12
  912.  
  913.   __uid_t v5; // eax@12
  914.  
  915.   __uid_t v6; // [sp+14h] [bp-14h]@1
  916.  
  917.   __gid_t v7; // [sp+18h] [bp-10h]@1
  918.  
  919.  
  920.  
  921.   v6 = getuid();
  922.  
  923.   v7 = getgid();
  924.  
  925.   initgroups(*(const char **)a1, *(_DWORD *)(a1 + 12));
  926.  
  927.   if ( setresgid(*(_DWORD *)(a1 + 12), *(_DWORD *)(a1 + 12)) >= 0 )
  928.  
  929.   {
  930.  
  931.     if ( setresuid(*(_DWORD *)(a1 + 8), *(_DWORD *)(a1 + 8)) >= 0 )
  932.  
  933.     {
  934.  
  935.       if ( *(_DWORD *)(a1 + 12) == v7 || setgid(v7) == -1 && setegid(v7) == -1 )
  936.  
  937.       {
  938.  
  939.         if ( *(_DWORD *)(a1 + 8) == v6 || setuid(v6) == -1 && seteuid(v6) == -1 )
  940.  
  941.         {
  942.  
  943.           if ( getgid() == *(_DWORD *)(a1 + 12) && getegid() == *(_DWORD *)(a1 + 12) )
  944.  
  945.           {
  946.  
  947.             if ( getuid() == *(_DWORD *)(a1 + 8) && geteuid() == *(_DWORD *)(a1 + 8) )
  948.  
  949.               result = chdir(*(const char **)(a1 + 20));
  950.  
  951.             else
  952.  
  953.               result = -1;
  954.  
  955.           }
  956.  
  957.           else
  958.  
  959.           {
  960.  
  961.             result = -1;
  962.  
  963.           }
  964.  
  965.         }
  966.  
  967.         else
  968.  
  969.         {
  970.  
  971.           v4 = *(_DWORD *)(a1 + 8);
  972.  
  973.           v5 = getuid();
  974.  
  975.           printf("setgid current uid: %d target uid: %d\n", v5, v4);
  976.  
  977.           result = -1;
  978.  
  979.         }
  980.  
  981.       }
  982.  
  983.       else
  984.  
  985.       {
  986.  
  987.         v2 = *(_DWORD *)(a1 + 12);
  988.  
  989.         v3 = getgid();
  990.  
  991.         printf("setgid current gid: %d target gid: %d\n", v3, v2);
  992.  
  993.         result = -1;
  994.  
  995.       }
  996.  
  997.     }
  998.  
  999.     else
  1000.  
  1001.     {
  1002.  
  1003.       result = -1;
  1004.  
  1005.     }
  1006.  
  1007.   }
  1008.  
  1009.   else
  1010.  
  1011.   {
  1012.  
  1013.     result = -1;
  1014.  
  1015.   }
  1016.  
  1017.   return result;
  1018.  
  1019. }
  1020.  
  1021. // 8048A30: using guessed type int __cdecl setresuid(_DWORD, _DWORD);
  1022.  
  1023. // 8048A40: using guessed type int __cdecl setresgid(_DWORD, _DWORD);
  1024.  
  1025.  
  1026.  
  1027. //----- (0804935C) --------------------------------------------------------
  1028.  
  1029. int __cdecl fill_head_with_madness(int a1)
  1030.  
  1031. {
  1032.  
  1033.   int result; // eax@1
  1034.  
  1035.  
  1036.  
  1037.   *(_DWORD *)(a1 + 4) = 0;
  1038.  
  1039.   *(_DWORD *)a1 = *(_DWORD *)(a1 + 4);
  1040.  
  1041.   *(_DWORD *)(a1 + 8) = -559038737;
  1042.  
  1043.   *(_DWORD *)(a1 + 12) = -782326291;
  1044.  
  1045.   *(_DWORD *)(a1 + 16) = -553727763;
  1046.  
  1047.   result = a1;
  1048.  
  1049.   *(_DWORD *)(a1 + 20) = -1161901314;
  1050.  
  1051.   return result;
  1052.  
  1053. }
  1054.  
  1055.  
  1056.  
  1057. //----- (0804939E) --------------------------------------------------------
  1058.  
  1059. char __cdecl sub_804939E(int a1, int a2, unsigned int a3)
  1060.  
  1061. {
  1062.  
  1063.   char result; // al@9
  1064.  
  1065.   int v4[16]; // [sp+14h] [bp-54h]@6
  1066.  
  1067.   int v5; // [sp+54h] [bp-14h]@1
  1068.  
  1069.   unsigned int v6; // [sp+58h] [bp-10h]@5
  1070.  
  1071.   int v7; // [sp+5Ch] [bp-Ch]@5
  1072.  
  1073.  
  1074.  
  1075.   v5 = (*(_DWORD *)a1 >> 3) & 0x3F;
  1076.  
  1077.   if ( *(_DWORD *)a1 + 8 * a3 < *(_DWORD *)a1 )
  1078.  
  1079.     ++*(_DWORD *)(a1 + 4);
  1080.  
  1081.   *(_DWORD *)a1 += 8 * a3;
  1082.  
  1083.   *(_DWORD *)(a1 + 4) += a3 >> 29;
  1084.  
  1085.   while ( 1 )
  1086.  
  1087.   {
  1088.  
  1089.     result = a3-- != 0;
  1090.  
  1091.     if ( !result )
  1092.  
  1093.       break;
  1094.  
  1095.     *(_BYTE *)(a1 + v5++ + 24) = *(_BYTE *)a2++;
  1096.  
  1097.     if ( v5 == 64 )
  1098.  
  1099.     {
  1100.  
  1101.       v6 = 0;
  1102.  
  1103.       v7 = 0;
  1104.  
  1105.       while ( v6 <= 0xF )
  1106.  
  1107.       {
  1108.  
  1109.         v4[v6++] = (*(_BYTE *)(a1 + v7 + 1 + 24) << 8) | (*(_BYTE *)(a1 + v7 + 2 + 24) << 16) | (*(_BYTE *)(a1 + v7 + 3 + 24) << 24) | *(_BYTE *)(a1 + v7 + 24);
  1110.  
  1111.         v7 += 4;
  1112.  
  1113.       }
  1114.  
  1115.       sub_8049649(a1 + 8, (int)v4);
  1116.  
  1117.       v5 = 0;
  1118.  
  1119.     }
  1120.  
  1121.   }
  1122.  
  1123.   return result;
  1124.  
  1125. }
  1126.  
  1127. // 804939E: using guessed type int var_54[16];
  1128.  
  1129.  
  1130.  
  1131. //----- (080494D4) --------------------------------------------------------
  1132.  
  1133. int __cdecl sub_80494D4(int a1)
  1134.  
  1135. {
  1136.  
  1137.   unsigned int v1; // eax@2
  1138.  
  1139.   int result; // eax@7
  1140.  
  1141.   int v3[14]; // [sp+10h] [bp-58h]@5
  1142.  
  1143.   int v4; // [sp+48h] [bp-20h]@1
  1144.  
  1145.   int v5; // [sp+4Ch] [bp-1Ch]@1
  1146.  
  1147.   int v6; // [sp+50h] [bp-18h]@1
  1148.  
  1149.   unsigned int v7; // [sp+54h] [bp-14h]@4
  1150.  
  1151.   int v8; // [sp+58h] [bp-10h]@4
  1152.  
  1153.   unsigned int v9; // [sp+5Ch] [bp-Ch]@4
  1154.  
  1155.  
  1156.  
  1157.   v4 = *(_DWORD *)a1;
  1158.  
  1159.   v5 = *(_DWORD *)(a1 + 4);
  1160.  
  1161.   v6 = (*(_DWORD *)a1 >> 3) & 0x3F;
  1162.  
  1163.   if ( v6 > 55 )
  1164.  
  1165.     v1 = 120 - v6;
  1166.  
  1167.   else
  1168.  
  1169.     v1 = 56 - v6;
  1170.  
  1171.   v9 = v1;
  1172.  
  1173.   sub_804939E(a1, (int)&unk_804E3C0, v1);
  1174.  
  1175.   v7 = 0;
  1176.  
  1177.   v8 = 0;
  1178.  
  1179.   while ( v7 <= 0xD )
  1180.  
  1181.   {
  1182.  
  1183.     v3[v7++] = (*(_BYTE *)(a1 + v8 + 1 + 24) << 8) | (*(_BYTE *)(a1 + v8 + 2 + 24) << 16) | (*(_BYTE *)(a1 + v8 + 3 + 24) << 24) | *(_BYTE *)(a1 + v8 + 24);
  1184.  
  1185.     v8 += 4;
  1186.  
  1187.   }
  1188.  
  1189.   result = sub_8049649(a1 + 8, (int)v3);
  1190.  
  1191.   v7 = 0;
  1192.  
  1193.   v8 = 0;
  1194.  
  1195.   while ( v7 <= 3 )
  1196.  
  1197.   {
  1198.  
  1199.     *(_BYTE *)(a1 + v8 + 88) = *(_DWORD *)(a1 + 4 * v7 + 8);
  1200.  
  1201.     *(_BYTE *)(a1 + v8 + 1 + 88) = *(_WORD *)(a1 + 4 * v7 + 8) >> 8;
  1202.  
  1203.     *(_BYTE *)(a1 + v8 + 2 + 88) = *(_DWORD *)(a1 + 4 * v7 + 8) >> 16;
  1204.  
  1205.     result = a1;
  1206.  
  1207.     *(_BYTE *)(a1 + v8 + 3 + 88) = *(_DWORD *)(a1 + 4 * v7++ + 8) >> 24;
  1208.  
  1209.     v8 += 4;
  1210.  
  1211.   }
  1212.  
  1213.   return result;
  1214.  
  1215. }
  1216.  
  1217. // 80494D4: using guessed type int var_58[14];
  1218.  
  1219.  
  1220.  
  1221. //----- (08049649) --------------------------------------------------------
  1222.  
  1223. int __cdecl sub_8049649(int a1, int a2)
  1224.  
  1225. {
  1226.  
  1227.   int result; // eax@1
  1228.  
  1229.   int v3; // ST04_4@1
  1230.  
  1231.   int v4; // ST08_4@1
  1232.  
  1233.   int v5; // ST0C_4@1
  1234.  
  1235.   int v6; // et0@1
  1236.  
  1237.   int v7; // ST00_4@1
  1238.  
  1239.   int v8; // et0@1
  1240.  
  1241.   int v9; // ST0C_4@1
  1242.  
  1243.   int v10; // et0@1
  1244.  
  1245.   int v11; // ST08_4@1
  1246.  
  1247.   int v12; // et0@1
  1248.  
  1249.   int v13; // ST04_4@1
  1250.  
  1251.   int v14; // et0@1
  1252.  
  1253.   int v15; // ST00_4@1
  1254.  
  1255.   int v16; // et0@1
  1256.  
  1257.   int v17; // ST0C_4@1
  1258.  
  1259.   int v18; // et0@1
  1260.  
  1261.   int v19; // ST08_4@1
  1262.  
  1263.   int v20; // et0@1
  1264.  
  1265.   int v21; // ST04_4@1
  1266.  
  1267.   int v22; // et0@1
  1268.  
  1269.   int v23; // ST00_4@1
  1270.  
  1271.   int v24; // et0@1
  1272.  
  1273.   int v25; // ST0C_4@1
  1274.  
  1275.   int v26; // et0@1
  1276.  
  1277.   int v27; // ST08_4@1
  1278.  
  1279.   int v28; // et0@1
  1280.  
  1281.   int v29; // ST04_4@1
  1282.  
  1283.   int v30; // et0@1
  1284.  
  1285.   int v31; // ST00_4@1
  1286.  
  1287.   int v32; // et0@1
  1288.  
  1289.   int v33; // ST0C_4@1
  1290.  
  1291.   int v34; // et0@1
  1292.  
  1293.   int v35; // ST08_4@1
  1294.  
  1295.   int v36; // et0@1
  1296.  
  1297.   int v37; // ST04_4@1
  1298.  
  1299.   int v38; // et0@1
  1300.  
  1301.   int v39; // ST00_4@1
  1302.  
  1303.   int v40; // et0@1
  1304.  
  1305.   int v41; // ST0C_4@1
  1306.  
  1307.   int v42; // et0@1
  1308.  
  1309.   int v43; // ST08_4@1
  1310.  
  1311.   int v44; // et0@1
  1312.  
  1313.   int v45; // ST04_4@1
  1314.  
  1315.   int v46; // et0@1
  1316.  
  1317.   int v47; // ST00_4@1
  1318.  
  1319.   int v48; // et0@1
  1320.  
  1321.   int v49; // ST0C_4@1
  1322.  
  1323.   int v50; // et0@1
  1324.  
  1325.   int v51; // ST08_4@1
  1326.  
  1327.   int v52; // et0@1
  1328.  
  1329.   int v53; // ST04_4@1
  1330.  
  1331.   int v54; // et0@1
  1332.  
  1333.   int v55; // ST00_4@1
  1334.  
  1335.   int v56; // et0@1
  1336.  
  1337.   int v57; // ST0C_4@1
  1338.  
  1339.   int v58; // et0@1
  1340.  
  1341.   int v59; // ST08_4@1
  1342.  
  1343.   int v60; // et0@1
  1344.  
  1345.   int v61; // ST04_4@1
  1346.  
  1347.   int v62; // et0@1
  1348.  
  1349.   int v63; // ST00_4@1
  1350.  
  1351.   int v64; // et0@1
  1352.  
  1353.   int v65; // ST0C_4@1
  1354.  
  1355.   int v66; // et0@1
  1356.  
  1357.   int v67; // ST08_4@1
  1358.  
  1359.   int v68; // et0@1
  1360.  
  1361.   int v69; // ST04_4@1
  1362.  
  1363.   int v70; // et0@1
  1364.  
  1365.   int v71; // ST00_4@1
  1366.  
  1367.   int v72; // et0@1
  1368.  
  1369.   int v73; // ST0C_4@1
  1370.  
  1371.   int v74; // et0@1
  1372.  
  1373.   int v75; // ST08_4@1
  1374.  
  1375.   int v76; // et0@1
  1376.  
  1377.   int v77; // ST04_4@1
  1378.  
  1379.   int v78; // et0@1
  1380.  
  1381.   int v79; // ST00_4@1
  1382.  
  1383.   int v80; // et0@1
  1384.  
  1385.   int v81; // ST0C_4@1
  1386.  
  1387.   int v82; // et0@1
  1388.  
  1389.   int v83; // ST08_4@1
  1390.  
  1391.   int v84; // et0@1
  1392.  
  1393.   int v85; // ST04_4@1
  1394.  
  1395.   int v86; // et0@1
  1396.  
  1397.   int v87; // ST00_4@1
  1398.  
  1399.   int v88; // et0@1
  1400.  
  1401.   int v89; // ST0C_4@1
  1402.  
  1403.   int v90; // et0@1
  1404.  
  1405.   int v91; // ST08_4@1
  1406.  
  1407.   int v92; // et0@1
  1408.  
  1409.   int v93; // ST04_4@1
  1410.  
  1411.   int v94; // et0@1
  1412.  
  1413.   int v95; // ST00_4@1
  1414.  
  1415.   int v96; // et0@1
  1416.  
  1417.   int v97; // ST0C_4@1
  1418.  
  1419.   int v98; // et0@1
  1420.  
  1421.   int v99; // ST08_4@1
  1422.  
  1423.   int v100; // et0@1
  1424.  
  1425.   int v101; // ST04_4@1
  1426.  
  1427.   int v102; // et0@1
  1428.  
  1429.   int v103; // ST00_4@1
  1430.  
  1431.   int v104; // et0@1
  1432.  
  1433.   int v105; // ST0C_4@1
  1434.  
  1435.   int v106; // et0@1
  1436.  
  1437.   int v107; // ST08_4@1
  1438.  
  1439.   int v108; // et0@1
  1440.  
  1441.   int v109; // ST04_4@1
  1442.  
  1443.   int v110; // et0@1
  1444.  
  1445.   int v111; // ST00_4@1
  1446.  
  1447.   int v112; // et0@1
  1448.  
  1449.   int v113; // ST0C_4@1
  1450.  
  1451.   int v114; // et0@1
  1452.  
  1453.   int v115; // ST08_4@1
  1454.  
  1455.   int v116; // et0@1
  1456.  
  1457.   int v117; // ST04_4@1
  1458.  
  1459.   int v118; // et0@1
  1460.  
  1461.   int v119; // ST00_4@1
  1462.  
  1463.   int v120; // et0@1
  1464.  
  1465.   int v121; // ST0C_4@1
  1466.  
  1467.   int v122; // et0@1
  1468.  
  1469.   int v123; // ST08_4@1
  1470.  
  1471.   int v124; // et0@1
  1472.  
  1473.   int v125; // ST04_4@1
  1474.  
  1475.   int v126; // et0@1
  1476.  
  1477.   int v127; // ST00_4@1
  1478.  
  1479.   int v128; // et0@1
  1480.  
  1481.   int v129; // ST0C_4@1
  1482.  
  1483.   int v130; // et0@1
  1484.  
  1485.   int v131; // ST08_4@1
  1486.  
  1487.   int v132; // et0@1
  1488.  
  1489.  
  1490.  
  1491.   v3 = *(_DWORD *)(a1 + 4);
  1492.  
  1493.   v4 = *(_DWORD *)(a1 + 8);
  1494.  
  1495.   v5 = *(_DWORD *)(a1 + 12);
  1496.  
  1497.   v6 = __ROR__(*(_DWORD *)a1 + (v5 & ~v3 | v4 & v3) + *(_DWORD *)a2 - 680876936, 25);
  1498.  
  1499.   v7 = v3 + v6;
  1500.  
  1501.   v8 = __ROR__(v5 + (v4 & ~(v3 + v6) | v3 & (v3 + v6)) + *(_DWORD *)(a2 + 4) - 389564586, 20);
  1502.  
  1503.   v9 = v7 + v8;
  1504.  
  1505.   v10 = __ROR__(v4 + (v3 & ~(v7 + v8) | v7 & (v7 + v8)) + *(_DWORD *)(a2 + 8) + 606105819, 15);
  1506.  
  1507.   v11 = v9 + v10;
  1508.  
  1509.   v12 = __ROR__(v3 + (v7 & ~(v9 + v10) | v9 & (v9 + v10)) + *(_DWORD *)(a2 + 12) - 1044525330, 10);
  1510.  
  1511.   v13 = v11 + v12;
  1512.  
  1513.   v14 = __ROR__(v7 + (v9 & ~(v11 + v12) | v11 & (v11 + v12)) + *(_DWORD *)(a2 + 16) - 176418897, 25);
  1514.  
  1515.   v15 = v13 + v14;
  1516.  
  1517.   v16 = __ROR__(v9 + (v11 & ~(v13 + v14) | v13 & (v13 + v14)) + *(_DWORD *)(a2 + 20) + 1200080426, 20);
  1518.  
  1519.   v17 = v15 + v16;
  1520.  
  1521.   v18 = __ROR__(v11 + (v13 & ~(v15 + v16) | v15 & (v15 + v16)) + *(_DWORD *)(a2 + 24) - 1473231341, 15);
  1522.  
  1523.   v19 = v17 + v18;
  1524.  
  1525.   v20 = __ROR__(v13 + (v15 & ~(v17 + v18) | v17 & (v17 + v18)) + *(_DWORD *)(a2 + 28) - 45705983, 10);
  1526.  
  1527.   v21 = v19 + v20;
  1528.  
  1529.   v22 = __ROR__(v15 + (v17 & ~(v19 + v20) | v19 & (v19 + v20)) + *(_DWORD *)(a2 + 32) + 1770035416, 25);
  1530.  
  1531.   v23 = v21 + v22;
  1532.  
  1533.   v24 = __ROR__(v17 + (v19 & ~(v21 + v22) | v21 & (v21 + v22)) + *(_DWORD *)(a2 + 36) - 1958414417, 20);
  1534.  
  1535.   v25 = v23 + v24;
  1536.  
  1537.   v26 = __ROR__(v19 + (v21 & ~(v23 + v24) | v23 & (v23 + v24)) + *(_DWORD *)(a2 + 40) - 42063, 15);
  1538.  
  1539.   v27 = v25 + v26;
  1540.  
  1541.   v28 = __ROR__(v21 + (v23 & ~(v25 + v26) | v25 & (v25 + v26)) + *(_DWORD *)(a2 + 44) - 1990404162, 10);
  1542.  
  1543.   v29 = v27 + v28;
  1544.  
  1545.   v30 = __ROR__(v23 + (v25 & ~(v27 + v28) | v27 & (v27 + v28)) + *(_DWORD *)(a2 + 48) + 1804603682, 25);
  1546.  
  1547.   v31 = v29 + v30;
  1548.  
  1549.   v32 = __ROR__(v25 + (v27 & ~(v29 + v30) | v29 & (v29 + v30)) + *(_DWORD *)(a2 + 52) - 40341101, 20);
  1550.  
  1551.   v33 = v31 + v32;
  1552.  
  1553.   v34 = __ROR__(v27 + (v29 & ~(v31 + v32) | v31 & (v31 + v32)) + *(_DWORD *)(a2 + 56) - 1502002290, 15);
  1554.  
  1555.   v35 = v33 + v34;
  1556.  
  1557.   v36 = __ROR__(v29 + (v31 & ~(v33 + v34) | v33 & (v33 + v34)) + *(_DWORD *)(a2 + 60) + 1236535329, 10);
  1558.  
  1559.   v37 = v35 + v36;
  1560.  
  1561.   v38 = __ROR__(v31 + (v35 & ~v33 | v33 & (v35 + v36)) + *(_DWORD *)(a2 + 4) - 165796510, 27);
  1562.  
  1563.   v39 = v37 + v38;
  1564.  
  1565.   v40 = __ROR__(v33 + (v37 & ~v35 | v35 & (v37 + v38)) + *(_DWORD *)(a2 + 24) - 1069501632, 23);
  1566.  
  1567.   v41 = v39 + v40;
  1568.  
  1569.   v42 = __ROR__(v35 + (v39 & ~v37 | v37 & (v39 + v40)) + *(_DWORD *)(a2 + 44) + 643717713, 18);
  1570.  
  1571.   v43 = v41 + v42;
  1572.  
  1573.   v44 = __ROR__(v37 + (v41 & ~v39 | v39 & (v41 + v42)) + *(_DWORD *)a2 - 373897302, 12);
  1574.  
  1575.   v45 = v43 + v44;
  1576.  
  1577.   v46 = __ROR__(v39 + (v43 & ~v41 | v41 & (v43 + v44)) + *(_DWORD *)(a2 + 20) - 701558691, 27);
  1578.  
  1579.   v47 = v45 + v46;
  1580.  
  1581.   v48 = __ROR__(v41 + (v45 & ~v43 | v43 & (v45 + v46)) + *(_DWORD *)(a2 + 40) + 38016083, 23);
  1582.  
  1583.   v49 = v47 + v48;
  1584.  
  1585.   v50 = __ROR__(v43 + (v47 & ~v45 | v45 & (v47 + v48)) + *(_DWORD *)(a2 + 60) - 660478335, 18);
  1586.  
  1587.   v51 = v49 + v50;
  1588.  
  1589.   v52 = __ROR__(v45 + (v49 & ~v47 | v47 & (v49 + v50)) + *(_DWORD *)(a2 + 16) - 405537848, 12);
  1590.  
  1591.   v53 = v51 + v52;
  1592.  
  1593.   v54 = __ROR__(v47 + (v51 & ~v49 | v49 & (v51 + v52)) + *(_DWORD *)(a2 + 36) + 568446438, 27);
  1594.  
  1595.   v55 = v53 + v54;
  1596.  
  1597.   v56 = __ROR__(v49 + (v53 & ~v51 | v51 & (v53 + v54)) + *(_DWORD *)(a2 + 56) - 1019803690, 23);
  1598.  
  1599.   v57 = v55 + v56;
  1600.  
  1601.   v58 = __ROR__(v51 + (v55 & ~v53 | v53 & (v55 + v56)) + *(_DWORD *)(a2 + 12) - 187363961, 18);
  1602.  
  1603.   v59 = v57 + v58;
  1604.  
  1605.   v60 = __ROR__(v53 + (v57 & ~v55 | v55 & (v57 + v58)) + *(_DWORD *)(a2 + 32) + 1163531501, 12);
  1606.  
  1607.   v61 = v59 + v60;
  1608.  
  1609.   v62 = __ROR__(v55 + (v59 & ~v57 | v57 & (v59 + v60)) + *(_DWORD *)(a2 + 52) - 1444681467, 27);
  1610.  
  1611.   v63 = v61 + v62;
  1612.  
  1613.   v64 = __ROR__(v57 + (v61 & ~v59 | v59 & (v61 + v62)) + *(_DWORD *)(a2 + 8) - 51403784, 23);
  1614.  
  1615.   v65 = v63 + v64;
  1616.  
  1617.   v66 = __ROR__(v59 + (v63 & ~v61 | v61 & (v63 + v64)) + *(_DWORD *)(a2 + 28) + 1735328473, 18);
  1618.  
  1619.   v67 = v65 + v66;
  1620.  
  1621.   v68 = __ROR__(v61 + (v65 & ~v63 | v63 & (v65 + v66)) + *(_DWORD *)(a2 + 48) - 1926607734, 12);
  1622.  
  1623.   v69 = v67 + v68;
  1624.  
  1625.   v70 = __ROR__(v63 + (v65 ^ (v67 + v68) ^ v67) + *(_DWORD *)(a2 + 20) - 378558, 28);
  1626.  
  1627.   v71 = v69 + v70;
  1628.  
  1629.   v72 = __ROR__(v65 + (v67 ^ (v69 + v70) ^ v69) + *(_DWORD *)(a2 + 32) - 2022574463, 21);
  1630.  
  1631.   v73 = v71 + v72;
  1632.  
  1633.   v74 = __ROR__(v67 + (v69 ^ (v71 + v72) ^ v71) + *(_DWORD *)(a2 + 44) + 1839030562, 16);
  1634.  
  1635.   v75 = v73 + v74;
  1636.  
  1637.   v76 = __ROR__(v69 + (v71 ^ (v73 + v74) ^ v73) + *(_DWORD *)(a2 + 56) - 35309556, 9);
  1638.  
  1639.   v77 = v75 + v76;
  1640.  
  1641.   v78 = __ROR__(v71 + (v73 ^ (v75 + v76) ^ v75) + *(_DWORD *)(a2 + 4) - 1530992060, 28);
  1642.  
  1643.   v79 = v77 + v78;
  1644.  
  1645.   v80 = __ROR__(v73 + (v75 ^ (v77 + v78) ^ v77) + *(_DWORD *)(a2 + 16) + 1272893353, 21);
  1646.  
  1647.   v81 = v79 + v80;
  1648.  
  1649.   v82 = __ROR__(v75 + (v77 ^ (v79 + v80) ^ v79) + *(_DWORD *)(a2 + 28) - 155497632, 16);
  1650.  
  1651.   v83 = v81 + v82;
  1652.  
  1653.   v84 = __ROR__(v77 + (v79 ^ (v81 + v82) ^ v81) + *(_DWORD *)(a2 + 40) - 1094730640, 9);
  1654.  
  1655.   v85 = v83 + v84;
  1656.  
  1657.   v86 = __ROR__(v79 + (v81 ^ (v83 + v84) ^ v83) + *(_DWORD *)(a2 + 52) + 681279174, 28);
  1658.  
  1659.   v87 = v85 + v86;
  1660.  
  1661.   v88 = __ROR__(v81 + (v83 ^ (v85 + v86) ^ v85) + *(_DWORD *)a2 - 358537222, 21);
  1662.  
  1663.   v89 = v87 + v88;
  1664.  
  1665.   v90 = __ROR__(v83 + (v85 ^ (v87 + v88) ^ v87) + *(_DWORD *)(a2 + 12) - 722521979, 16);
  1666.  
  1667.   v91 = v89 + v90;
  1668.  
  1669.   v92 = __ROR__(v85 + (v87 ^ (v89 + v90) ^ v89) + *(_DWORD *)(a2 + 24) + 76029189, 9);
  1670.  
  1671.   v93 = v91 + v92;
  1672.  
  1673.   v94 = __ROR__(v87 + (v89 ^ (v91 + v92) ^ v91) + *(_DWORD *)(a2 + 36) - 640364487, 28);
  1674.  
  1675.   v95 = v93 + v94;
  1676.  
  1677.   v96 = __ROR__(v89 + (v91 ^ (v93 + v94) ^ v93) + *(_DWORD *)(a2 + 48) - 421815835, 21);
  1678.  
  1679.   v97 = v95 + v96;
  1680.  
  1681.   v98 = __ROR__(v91 + (v93 ^ (v95 + v96) ^ v95) + *(_DWORD *)(a2 + 60) + 530742520, 16);
  1682.  
  1683.   v99 = v97 + v98;
  1684.  
  1685.   v100 = __ROR__(v93 + (v95 ^ (v97 + v98) ^ v97) + *(_DWORD *)(a2 + 8) - 995338651, 9);
  1686.  
  1687.   v101 = v99 + v100;
  1688.  
  1689.   v102 = __ROR__(v95 + (v99 ^ ((v99 + v100) | ~v97)) + *(_DWORD *)a2 - 198630844, 26);
  1690.  
  1691.   v103 = v101 + v102;
  1692.  
  1693.   v104 = __ROR__(v97 + (v101 ^ ((v101 + v102) | ~v99)) + *(_DWORD *)(a2 + 28) + 1126891415, 22);
  1694.  
  1695.   v105 = v103 + v104;
  1696.  
  1697.   v106 = __ROR__(v99 + (v103 ^ ((v103 + v104) | ~v101)) + *(_DWORD *)(a2 + 56) - 1416354905, 17);
  1698.  
  1699.   v107 = v105 + v106;
  1700.  
  1701.   v108 = __ROR__(v101 + (v105 ^ ((v105 + v106) | ~v103)) + *(_DWORD *)(a2 + 20) - 57434055, 11);
  1702.  
  1703.   v109 = v107 + v108;
  1704.  
  1705.   v110 = __ROR__(v103 + (v107 ^ ((v107 + v108) | ~v105)) + *(_DWORD *)(a2 + 48) + 1700485571, 26);
  1706.  
  1707.   v111 = v109 + v110;
  1708.  
  1709.   v112 = __ROR__(v105 + (v109 ^ ((v109 + v110) | ~v107)) + *(_DWORD *)(a2 + 12) - 1894986606, 22);
  1710.  
  1711.   v113 = v111 + v112;
  1712.  
  1713.   v114 = __ROR__(v107 + (v111 ^ ((v111 + v112) | ~v109)) + *(_DWORD *)(a2 + 40) - 1051523, 17);
  1714.  
  1715.   v115 = v113 + v114;
  1716.  
  1717.   v116 = __ROR__(v109 + (v113 ^ ((v113 + v114) | ~v111)) + *(_DWORD *)(a2 + 4) - 2054922799, 11);
  1718.  
  1719.   v117 = v115 + v116;
  1720.  
  1721.   v118 = __ROR__(v111 + (v115 ^ ((v115 + v116) | ~v113)) + *(_DWORD *)(a2 + 32) + 1873313359, 26);
  1722.  
  1723.   v119 = v117 + v118;
  1724.  
  1725.   v120 = __ROR__(v113 + (v117 ^ ((v117 + v118) | ~v115)) + *(_DWORD *)(a2 + 60) - 30611744, 22);
  1726.  
  1727.   v121 = v119 + v120;
  1728.  
  1729.   v122 = __ROR__(v115 + (v119 ^ ((v119 + v120) | ~v117)) + *(_DWORD *)(a2 + 24) - 1560198380, 17);
  1730.  
  1731.   v123 = v121 + v122;
  1732.  
  1733.   v124 = __ROR__(v117 + (v121 ^ ((v121 + v122) | ~v119)) + *(_DWORD *)(a2 + 52) + 1309151649, 11);
  1734.  
  1735.   v125 = v123 + v124;
  1736.  
  1737.   v126 = __ROR__(v119 + (v123 ^ ((v123 + v124) | ~v121)) + *(_DWORD *)(a2 + 16) - 145523070, 26);
  1738.  
  1739.   v127 = v125 + v126;
  1740.  
  1741.   v128 = __ROR__(v121 + (v125 ^ ((v125 + v126) | ~v123)) + *(_DWORD *)(a2 + 44) - 1120210379, 22);
  1742.  
  1743.   v129 = v127 + v128;
  1744.  
  1745.   v130 = __ROR__(v123 + (v127 ^ ((v127 + v128) | ~v125)) + *(_DWORD *)(a2 + 8) + 718787259, 17);
  1746.  
  1747.   v131 = v129 + v130;
  1748.  
  1749.   v132 = __ROR__(v125 + (v129 ^ ((v129 + v130) | ~v127)) + *(_DWORD *)(a2 + 36) - 343485551, 11);
  1750.  
  1751.   *(_DWORD *)a1 += v127;
  1752.  
  1753.   *(_DWORD *)(a1 + 4) += v131 + v132;
  1754.  
  1755.   *(_DWORD *)(a1 + 8) += v131;
  1756.  
  1757.   result = v129 + *(_DWORD *)(a1 + 12);
  1758.  
  1759.   *(_DWORD *)(a1 + 12) = result;
  1760.  
  1761.   return result;
  1762.  
  1763. }
  1764.  
  1765.  
  1766.  
  1767. //----- (0804A296) --------------------------------------------------------
  1768.  
  1769. int __cdecl sub_804A296(int a1)
  1770.  
  1771. {
  1772.  
  1773.   int result; // eax@2
  1774.  
  1775.   signed int i; // [sp+1Ch] [bp-Ch]@1
  1776.  
  1777.  
  1778.  
  1779.   for ( i = 0; i <= 15; ++i )
  1780.  
  1781.     result = printf("%02x", *(_BYTE *)(a1 + i + 88));
  1782.  
  1783.   return result;
  1784.  
  1785. }
  1786.  
  1787.  
  1788.  
  1789. //----- (0804A3DC) --------------------------------------------------------
  1790.  
  1791. int __cdecl sub_804A3DC(const char *s)
  1792.  
  1793. {
  1794.  
  1795.   char v2; // [sp+14h] [bp-74h]@1
  1796.  
  1797.   unsigned int v3; // [sp+7Ch] [bp-Ch]@1
  1798.  
  1799.  
  1800.  
  1801.   v3 = strlen(s);
  1802.  
  1803.   fill_head_with_madness((int)&v2);
  1804.  
  1805.   sub_804939E((int)&v2, (int)s, v3);
  1806.  
  1807.   sub_80494D4((int)&v2);
  1808.  
  1809.   sub_804A296((int)&v2);
  1810.  
  1811.   return printf(" \"%s\"\n\n", s);
  1812.  
  1813. }
  1814.  
  1815.  
  1816.  
  1817. //----- (0804A443) --------------------------------------------------------
  1818.  
  1819. int __cdecl sub_804A443(const char *filename)
  1820.  
  1821. {
  1822.  
  1823.   int result; // eax@2
  1824.  
  1825.   char ptr; // [sp+10h] [bp-478h]@4
  1826.  
  1827.   char v3; // [sp+410h] [bp-78h]@3
  1828.  
  1829.   FILE *stream; // [sp+478h] [bp-10h]@1
  1830.  
  1831.   unsigned int v5; // [sp+47Ch] [bp-Ch]@4
  1832.  
  1833.  
  1834.  
  1835.   stream = fopen(filename, "rb");
  1836.  
  1837.   if ( stream )
  1838.  
  1839.   {
  1840.  
  1841.     fill_head_with_madness((int)&v3);
  1842.  
  1843.     while ( 1 )
  1844.  
  1845.     {
  1846.  
  1847.       v5 = fread(&ptr, 1u, 0x400u, stream);
  1848.  
  1849.       if ( !v5 )
  1850.  
  1851.         break;
  1852.  
  1853.       sub_804939E((int)&v3, (int)&ptr, v5);
  1854.  
  1855.     }
  1856.  
  1857.     sub_80494D4((int)&v3);
  1858.  
  1859.     sub_804A296((int)&v3);
  1860.  
  1861.     printf(" %s\n", filename);
  1862.  
  1863.     result = fclose(stream);
  1864.  
  1865.   }
  1866.  
  1867.   else
  1868.  
  1869.   {
  1870.  
  1871.     result = printf("%s can't be opened.\n", filename);
  1872.  
  1873.   }
  1874.  
  1875.   return result;
  1876.  
  1877. }
  1878.  
  1879.  
  1880.  
  1881. //----- (0804A60A) --------------------------------------------------------
  1882.  
  1883. char *__cdecl sub_804A60A(int a1, char *dest)
  1884.  
  1885. {
  1886.  
  1887.   char *result; // eax@1
  1888.  
  1889.   char src; // [sp+16h] [bp-42h]@2
  1890.  
  1891.   int i; // [sp+48h] [bp-10h]@1
  1892.  
  1893.   int v5; // [sp+4Ch] [bp-Ch]@2
  1894.  
  1895.  
  1896.  
  1897.   result = dest;
  1898.  
  1899.   *dest = 0;
  1900.  
  1901.   for ( i = 0; i <= 15; ++i )
  1902.  
  1903.   {
  1904.  
  1905.     v5 = sprintf(&src, "%02x", *(_BYTE *)(a1 + i + 88));
  1906.  
  1907.     result = strcat(dest, &src);
  1908.  
  1909.   }
  1910.  
  1911.   return result;
  1912.  
  1913. }
  1914.  
  1915.  
  1916.  
  1917. //----- (0804A666) --------------------------------------------------------
  1918.  
  1919. char *__cdecl md5(const char *s, char *dest)
  1920.  
  1921. {
  1922.  
  1923.   int v3; // [sp+14h] [bp-74h]@1
  1924.  
  1925.   unsigned int v4; // [sp+7Ch] [bp-Ch]@1
  1926.  
  1927.  
  1928.  
  1929.   v4 = strlen(s);
  1930.  
  1931.   fill_head_with_madness((int)&v3);
  1932.  
  1933.   sub_804939E((int)&v3, (int)s, v4);
  1934.  
  1935.   sub_80494D4((int)&v3);
  1936.  
  1937.   return sub_804A60A((int)&v3, dest);
  1938.  
  1939. }
  1940.  
  1941.  
  1942.  
  1943. //----- (0804A6C0) --------------------------------------------------------
  1944.  
  1945. int __cdecl print_user(int fd, int a2)
  1946.  
  1947. {
  1948.  
  1949.   write_string(fd, "<node> %x\n", a2);
  1950.  
  1951.   write_string(fd, "  chickens: %u \n", *(_DWORD *)(a2 + 60));
  1952.  
  1953.   write_string(fd, "  eggs:     %u \n", *(_DWORD *)(a2 + 68));
  1954.  
  1955.   write_string(fd, "  monies:   %u \n", *(_DWORD *)(a2 + 64));
  1956.  
  1957.   write_string(fd, "  id:       %u \n", *(_DWORD *)(a2 + 72));
  1958.  
  1959.   write_string(fd, "  username: %s \n", a2);
  1960.  
  1961.   write_string(fd, "  info:     %s \n", a2 + 84);
  1962.  
  1963.   write_string(fd, "  office:   %s \n", a2 + 134);
  1964.  
  1965.   write_string(fd, "  password: %s \n\n", a2 + 20);
  1966.  
  1967.   write_string(fd, "  perm:     %u \n", *(_DWORD *)(a2 + 56));
  1968.  
  1969.   write_string(fd, "  next:     %x \n", *(_DWORD *)(a2 + 76));
  1970.  
  1971.   return write_string(fd, "  prev:     %x \n", *(_DWORD *)(a2 + 80));
  1972.  
  1973. }
  1974.  
  1975.  
  1976.  
  1977. //----- (0804A820) --------------------------------------------------------
  1978.  
  1979. int __cdecl print_all_users(int fd, int a2)
  1980.  
  1981. {
  1982.  
  1983.   int result; // eax@3
  1984.  
  1985.   int i; // [sp+1Ch] [bp-Ch]@1
  1986.  
  1987.  
  1988.  
  1989.   for ( i = a2; ; print_user(fd, i) )
  1990.  
  1991.   {
  1992.  
  1993.     result = *(_DWORD *)(i + 76);
  1994.  
  1995.     if ( !result )
  1996.  
  1997.       break;
  1998.  
  1999.     i = *(_DWORD *)(i + 76);
  2000.  
  2001.   }
  2002.  
  2003.   return result;
  2004.  
  2005. }
  2006.  
  2007.  
  2008.  
  2009. //----- (0804A855) --------------------------------------------------------
  2010.  
  2011. int __cdecl print_current_user(int fd, int a2)
  2012.  
  2013. {
  2014.  
  2015.   int result; // eax@4
  2016.  
  2017.   int v3; // [sp+1Ch] [bp-Ch]@1
  2018.  
  2019.  
  2020.  
  2021.   v3 = a2;
  2022.  
  2023.   while ( 1 )
  2024.  
  2025.   {
  2026.  
  2027.     result = *(_DWORD *)(v3 + 76);
  2028.  
  2029.     if ( !result )
  2030.  
  2031.       break;
  2032.  
  2033.     v3 = *(_DWORD *)(v3 + 76);
  2034.  
  2035.     if ( !strcmp(&s1, (const char *)v3) )
  2036.  
  2037.       print_user(fd, v3);
  2038.  
  2039.   }
  2040.  
  2041.   return result;
  2042.  
  2043. }
  2044.  
  2045.  
  2046.  
  2047. //----- (0804A8A1) --------------------------------------------------------
  2048.  
  2049. int __cdecl check_username_n_pass(int fd, char *a2, const char *s1 /* user */, const char *s /* pass */)
  2050.  
  2051. {
  2052.  
  2053.   char dest; // [sp+17h] [bp-31h]@3
  2054.  
  2055.   char v6; // [sp+37h] [bp-11h]@3
  2056.  
  2057.   int v7; // [sp+38h] [bp-10h]@1
  2058.  
  2059.   char *src; // [sp+3Ch] [bp-Ch]@1
  2060.  
  2061.  
  2062.  
  2063.   v7 = 1;
  2064.  
  2065.   src = a2;
  2066.  
  2067.   while ( *((_DWORD *)src + 19) )
  2068.  
  2069.   {
  2070.  
  2071.     src = (char *)*((_DWORD *)src + 19);
  2072.  
  2073.     if ( !strcmp(s1, src) )
  2074.  
  2075.     {
  2076.  
  2077.       md5(s, &dest); /* md5 */
  2078.  
  2079.       v6 = 0;
  2080.  
  2081.       if ( !strncmp(&dest, src + 20, 0x20u) )
  2082.  
  2083.       {
  2084.  
  2085.         write_string(fd, "lcgged in!\n", src + 20);
  2086.  
  2087.         logged_in = 1;
  2088.  
  2089.         strncpy(&::s1, src, 20);
  2090.  
  2091.         if ( src.perm ) > 499 )
  2092.  
  2093.           admin = 1;
  2094.  
  2095.         return 0;
  2096.  
  2097.       }
  2098.  
  2099.     }
  2100.  
  2101.   }
  2102.  
  2103.   return v7;
  2104.  
  2105. }
  2106.  
  2107. // 804E420: using guessed type int dword_804E420;
  2108.  
  2109. // 804E424: using guessed type int dword_804E424;
  2110.  
  2111.  
  2112.  
  2113. //----- (0804A988) --------------------------------------------------------
  2114.  
  2115. void __cdecl log_out()
  2116.  
  2117. {
  2118.  
  2119.   logged_in = 0;
  2120.  
  2121.   admin = 0;
  2122.  
  2123.   s1 = 0;
  2124.  
  2125. }
  2126.  
  2127. // 804E420: using guessed type int dword_804E420;
  2128.  
  2129. // 804E424: using guessed type int dword_804E424;
  2130.  
  2131.  
  2132.  
  2133. //----- (0804A9CB) --------------------------------------------------------
  2134.  
  2135. signed int __cdecl user_exists(struct *users, const char *username)
  2136.  
  2137. {
  2138.  
  2139.   struct *curuser; // [sp+1Ch] [bp-Ch]@1
  2140.  
  2141.  
  2142.  
  2143.   curuser = users;
  2144.  
  2145.   while ( *(_DWORD *)(curuser.next) )
  2146.  
  2147.   {
  2148.  
  2149.     curuser = *(_DWORD *)(curuser.next);
  2150.  
  2151.     if ( !strcmp((const char *)curuser, username) )
  2152.  
  2153.       return 1;
  2154.  
  2155.   }
  2156.  
  2157.   return 0;
  2158.  
  2159. }
  2160.  
  2161.  
  2162.  
  2163. //----- (0804AA10) --------------------------------------------------------
  2164.  
  2165. int __cdecl read_yes_or_no(int fd, int a2)
  2166.  
  2167. {
  2168.  
  2169.   int i; // [sp+1Ch] [bp-Ch]@1
  2170.  
  2171.  
  2172.  
  2173.   for ( i = read_x_bytes_or_til_escape_char(fd, a2, 0x257u, 10);
  2174.  
  2175.         i != 1 || *(_BYTE *)a2 != 121 && *(_BYTE *)a2 != 110;
  2176.  
  2177.         i = read_x_bytes_or_til_escape_char(fd, a2, 0x257u, 10) )
  2178.  
  2179.     send_with_or_without_null(fd, "[y/n]", 0);
  2180.  
  2181.   return *(_BYTE *)a2;
  2182.  
  2183. }
  2184.  
  2185.  
  2186.  
  2187. //----- (0804AA9F) --------------------------------------------------------
  2188.  
  2189. signed int __cdecl create_user(int fd, const char *s, int head)
  2190.  
  2191. {
  2192.  
  2193.   signed int result; // eax@2
  2194.  
  2195.   const char dest[33]; // [sp+39h] [bp-8Fh]@3
  2196.  
  2197.   const char office[20]; // [sp+5Ah] [bp-6Eh]@3
  2198.  
  2199.   const char info[50]; // [sp+6Eh] [bp-5Ah]@3
  2200.  
  2201.   char user[50]; // [sp+A0h] [bp-28h]@1
  2202.  
  2203.   int id; // [sp+B4h] [bp-14h]@1
  2204.  
  2205.   int v9; // [sp+B8h] [bp-10h]@1
  2206.  
  2207.   int v10; // [sp+BCh] [bp-Ch]@1
  2208.  
  2209.  
  2210.  
  2211.   id = 0;
  2212.  
  2213.   v10 = 0;
  2214.  
  2215.   send_with_or_without_null(fd, "enter new username: ", 0);
  2216.  
  2217.   readlen = read_x_bytes_or_til_escape_char(fd, (int)s, 0x257u, 10);
  2218.  
  2219.   s[readlen] = 0;
  2220.  
  2221.   strncpy(&user, s, 20);
  2222.  
  2223.   if ( user_exists(head, &src) )
  2224.  
  2225.   {
  2226.  
  2227.     result = 1;
  2228.  
  2229.   }
  2230.  
  2231.   else
  2232.  
  2233.   {
  2234.  
  2235.     send_with_or_without_null(fd, "enter new info: ", 0);
  2236.  
  2237.     readlen = read_x_bytes_or_til_escape_char(fd, (int)s, 0x257u, 10);
  2238.  
  2239.     s[readlen] = 0;
  2240.  
  2241.     strncpy((char *)info, s, 50);
  2242.  
  2243.     send_with_or_without_null(fd, "enter new office: ", 0);
  2244.  
  2245.     readlen = read_x_bytes_or_til_escape_char(fd, (int)s, 0x257u, 10);
  2246.  
  2247.     s[readlen] = 0;
  2248.  
  2249.     strncpy((char *)office, s, 20);
  2250.  
  2251.     send_with_or_without_null(fd, "enter new pass: ", 0);
  2252.  
  2253.     readlen = read_x_bytes_or_til_escape_char(fd, (int)s, 0x257u, 10);
  2254.  
  2255.     s[readlen] = 0;
  2256.  
  2257.     strncpy((char *)password, s, 33);
  2258.  
  2259.     md5(s, (char *)password);
  2260.  
  2261.     if ( allocandfillstruct(fd, head, &username, info, office, password, id, 1, 1000, 0, 0) )
  2262.  
  2263.     {
  2264.  
  2265.       v10 = 1;
  2266.  
  2267.       write_string(fd, "insert failed.\n");
  2268.  
  2269.     }
  2270.  
  2271.     result = v10;
  2272.  
  2273.   }
  2274.  
  2275.   return result;
  2276.  
  2277. }
  2278.  
  2279.  
  2280. //----- (0804ACFC) --------------------------------------------------------
  2281.  
  2282. int __cdecl buy_eggs(int fd, const char *nptr, int a3)
  2283.  
  2284. {
  2285.  
  2286.   int result; // eax@4
  2287.  
  2288.   int v4; // [sp+2E8h] [bp-10h]@1
  2289.  
  2290.   int v5; // [sp+2ECh] [bp-Ch]@5
  2291.  
  2292.  
  2293.  
  2294.   v4 = a3;
  2295.  
  2296.   do
  2297.  
  2298.   {
  2299.  
  2300.     if ( !*(_DWORD *)(v4 + 76) )
  2301.  
  2302.       break;
  2303.  
  2304.     v4 = *(_DWORD *)(v4 + 76);
  2305.  
  2306.   }
  2307.  
  2308.   while ( strcmp(&s1, (const char *)v4) );
  2309.  
  2310.   write_string(fd, "you currently have $%u and %u eggs\n ", *(_DWORD *)(v4 + 64), *(_DWORD *)(v4 + 68));
  2311.  
  2312.   write_string(fd, "market price for an egg is %u\n ", *(_DWORD *)eggprice);
  2313.  
  2314.   write_string(fd, "would you like to sell eggs [y/n]: ");
  2315.  
  2316.   result = read_yes_or_no(fd, (int)nptr);
  2317.  
  2318.   if ( (_BYTE)result == 121 )
  2319.  
  2320.   {
  2321.  
  2322.     write_string(fd, "how many?: ");
  2323.  
  2324.     nptr[read_x_bytes_or_til_escape_char(fd, (int)nptr, 0x257u, 10)] = 0;
  2325.  
  2326.     v5 = atoi(nptr);
  2327.  
  2328.     if ( (unsigned int)v5 >= *(_DWORD *)(v4 + 68) )
  2329.  
  2330.     {
  2331.  
  2332.       result = write_string(fd, "not enough eggs!\n");
  2333.  
  2334.     }
  2335.  
  2336.     else
  2337.  
  2338.     {
  2339.  
  2340.       *(_DWORD *)(v4 + 68) -= v5;
  2341.  
  2342.       *(_DWORD *)(v4 + 64) += v5 * *(_DWORD *)eggprice;
  2343.  
  2344.       result = write_string(fd, "%u sold!\n", v5);
  2345.  
  2346.     }
  2347.  
  2348.   }
  2349.  
  2350.   return result;
  2351.  
  2352. }
  2353.  
  2354.  
  2355.  
  2356. //----- (0804AE76) --------------------------------------------------------
  2357.  
  2358. int __cdecl burn_money(int fd, const char *nptr, int a3)
  2359.  
  2360. {
  2361.  
  2362.   int result; // eax@4
  2363.  
  2364.   int v4; // [sp+2E4h] [bp-14h]@1
  2365.  
  2366.   int v5; // [sp+2ECh] [bp-Ch]@6
  2367.  
  2368.  
  2369.  
  2370.   v4 = a3;
  2371.  
  2372.   do
  2373.  
  2374.   {
  2375.  
  2376.     if ( !*(_DWORD *)(v4 + 76) )
  2377.  
  2378.       break;
  2379.  
  2380.     v4 = *(_DWORD *)(v4 + 76);
  2381.  
  2382.   }
  2383.  
  2384.   while ( strcmp(&s1, (const char *)v4) );
  2385.  
  2386.   write_string(fd, "you currently have $%u\n ", *(_DWORD *)(v4 + 64));
  2387.  
  2388.   write_string(fd, "would you like to incinerate some?[y/n]: ");
  2389.  
  2390.   result = read_yes_or_no(fd, (int)nptr);
  2391.  
  2392.   if ( (_BYTE)result == 121 || (_BYTE)result == 110 )
  2393.  
  2394.   {
  2395.  
  2396.     write_string(fd, "how much?: ");
  2397.  
  2398.     nptr[read_x_bytes_or_til_escape_char(fd, (int)nptr, 0x257u, 10)] = 0;
  2399.  
  2400.     v5 = atoi(nptr);
  2401.  
  2402.     if ( (unsigned int)v5 >= *(_DWORD *)(v4 + 64) )
  2403.  
  2404.     {
  2405.  
  2406.       *(_DWORD *)(v4 + 64) = 0;
  2407.  
  2408.       result = write_string(fd, "oh snap!  it's all gone! all that's left is ashes!\n");
  2409.  
  2410.     }
  2411.  
  2412.     else
  2413.  
  2414.     {
  2415.  
  2416.       *(_DWORD *)(v4 + 64) -= v5;
  2417.  
  2418.       result = write_string(fd, "%u burnt to a crisp!\n", v5);
  2419.  
  2420.     }
  2421.  
  2422.   }
  2423.  
  2424.   return result;
  2425.  
  2426. }
  2427.  
  2428.  
  2429.  
  2430. //----- (0804AFC6) --------------------------------------------------------
  2431.  
  2432. int __cdecl buy_chickens(int fd, const char *nptr, int a3)
  2433.  
  2434. {
  2435.  
  2436.   int result; // eax@4
  2437.  
  2438.   int v4; // [sp+2E8h] [bp-10h]@1
  2439.  
  2440.   int v5; // [sp+2ECh] [bp-Ch]@5
  2441.  
  2442.  
  2443.  
  2444.   v4 = a3;
  2445.  
  2446.   do
  2447.  
  2448.   {
  2449.  
  2450.     if ( !*(_DWORD *)(v4 + 76) )
  2451.  
  2452.       break;
  2453.  
  2454.     v4 = *(_DWORD *)(v4 + 76);
  2455.  
  2456.   }
  2457.  
  2458.   while ( strcmp(&s1, (const char *)v4) );
  2459.  
  2460.   write_string(fd, "you currently have $%u and %u chickens\n ", *(_DWORD *)(v4 + 64), *(_DWORD *)(v4 + 60));
  2461.  
  2462.   write_string(fd, "market price for a chicken is %u\n ", *(_DWORD *)chickenprice);
  2463.  
  2464.   write_string(fd, "would you like to buy chickens [y/n]: ");
  2465.  
  2466.   result = read_yes_or_no(fd, (int)nptr);
  2467.  
  2468.   if ( (_BYTE)result == 121 )
  2469.  
  2470.   {
  2471.  
  2472.     write_string(fd, "how many?: ");
  2473.  
  2474.     nptr[read_x_bytes_or_til_escape_char(fd, (int)nptr, 0x257u, 10)] = 0;
  2475.  
  2476.     v5 = atoi(nptr);
  2477.  
  2478.     if ( (unsigned int)(*(_DWORD *)chickenprice * v5) > *(_DWORD *)(v4 + 64) )
  2479.  
  2480.     {
  2481.  
  2482.       result = write_string(fd, "not enough money!\n");
  2483.  
  2484.     }
  2485.  
  2486.     else
  2487.  
  2488.     {
  2489.  
  2490.       *(_DWORD *)(v4 + 64) -= v5 * chickenprice;
  2491.  
  2492.       *(_DWORD *)(v4 + 60) += v5;
  2493.  
  2494.       result = write_string(fd, "%u purchased!\n", v5);
  2495.  
  2496.     }
  2497.  
  2498.   }
  2499.  
  2500.   return result;
  2501.  
  2502. }
  2503.  
  2504.  
  2505.  
  2506. //----- (0804B148) --------------------------------------------------------
  2507.  
  2508. int __cdecl change_info(int fd, const char *nptr, int a3)
  2509.  
  2510. {
  2511.  
  2512.   int v4; // [sp+C0h] [bp-18h]@1
  2513.  
  2514.   int v5; // [sp+CCh] [bp-Ch]@1
  2515.  
  2516.  
  2517.  
  2518.   v4 = 0;
  2519.  
  2520.   v5 = a3;
  2521.  
  2522.   do
  2523.  
  2524.   {
  2525.  
  2526.     if ( !*(_DWORD *)(v5 + 76) )
  2527.  
  2528.       break;
  2529.  
  2530.     v5 = *(_DWORD *)(v5 + 76);
  2531.  
  2532.   }
  2533.  
  2534.   while ( strcmp(&s1, (const char *)v5) );
  2535.  
  2536.   write_string(fd, "would you like to change username (%s) [y/n]: ", &s1);
  2537.  
  2538.   if ( (unsigned __int8)read_yes_or_no(fd, (int)nptr) == 121 )
  2539.  
  2540.   {
  2541.  
  2542.     write_string(fd, "enter new username: ");
  2543.  
  2544.     v4 = read_x_bytes_or_til_escape_char(fd, (int)nptr, 0x257u, 10);
  2545.  
  2546.     nptr[v4] = 0;
  2547.  
  2548.     strncpy((char *)v5, nptr, 20);
  2549.  
  2550.     strncpy(&s1, nptr, 20);
  2551.  
  2552.   }
  2553.  
  2554.   write_string(fd, "would you like to change user info (%s) [y/n]: ", v5 + 84);
  2555.  
  2556.   if ( (unsigned __int8)read_yes_or_no(fd, (int)nptr) == 121 )
  2557.  
  2558.   {
  2559.  
  2560.     write_string(fd, "enter new info: ");
  2561.  
  2562.     v4 = read_x_bytes_or_til_escape_char(fd, (int)nptr, 0x257u, 10);
  2563.  
  2564.     nptr[v4] = 0;
  2565.  
  2566.     strncpy((char *)(v5 + 84), nptr, 50);
  2567.  
  2568.   }
  2569.  
  2570.   write_string(fd, "would you like to change office #(%s) [y/n]: ", v5 + 134);
  2571.  
  2572.   if ( (unsigned __int8)read_yes_or_no(fd, (int)nptr) == 121 )
  2573.  
  2574.   {
  2575.  
  2576.     write_string(fd, "enter new office: ");
  2577.  
  2578.     v4 = read_x_bytes_or_til_escape_char(fd, (int)nptr, 0x257u, 10);
  2579.  
  2580.     nptr[v4] = 0;
  2581.  
  2582.     strcpy((char *)(v5 + 134), nptr);
  2583.  
  2584.   }
  2585.  
  2586.   write_string(fd, "would you like to change password [y/n]: ");
  2587.  
  2588.   if ( (unsigned __int8)read_yes_or_no(fd, (int)nptr) == 121 )
  2589.  
  2590.   {
  2591.  
  2592.     write_string(fd, "enter new pass: ");
  2593.  
  2594.     v4 = read_x_bytes_or_til_escape_char(fd, (int)nptr, 599, 10);
  2595.  
  2596.     nptr[v4] = 0;
  2597.  
  2598.     strncpy((char *)(v5 + 20), nptr, 33);
  2599.  
  2600.   }
  2601.  
  2602.   write_string(fd, "would you like to change uid(%u) [y/n]: ", *(_DWORD *)(v5 + 72));
  2603.  
  2604.   if ( (unsigned __int8)read_yes_or_no(fd, (int)nptr) == 121 )
  2605.  
  2606.   {
  2607.  
  2608.     write_string(fd, "enter new uid: ");
  2609.  
  2610.     v4 = read_x_bytes_or_til_escape_char(fd, (int)nptr, 0x257u, 10);
  2611.  
  2612.     nptr[v4] = 0;
  2613.  
  2614.     *(_DWORD *)(v5 + 72) = atoi(nptr);
  2615.  
  2616.   }
  2617.  
  2618.   write_string(fd, "would you like to change you egg count(%u) [y/n]: ", *(_DWORD *)(v5 + 68));
  2619.  
  2620.   if ( (unsigned __int8)read_yes_or_no(fd, (int)nptr) == 121 )
  2621.  
  2622.   {
  2623.  
  2624.     write_string(fd, "enter new egg count: ");
  2625.  
  2626.     v4 = read_x_bytes_or_til_escape_char(fd, (int)nptr, 0x257u, 10);
  2627.  
  2628.     nptr[v4] = 0;
  2629.  
  2630.     if ( admin )
  2631.  
  2632.       *(_DWORD *)(v5 + 68) = atoi(nptr);
  2633.  
  2634.     else
  2635.  
  2636.       write_string(fd, "you don't have enough permissions to change egg amount\n");
  2637.  
  2638.   }
  2639.  
  2640.   write_string(fd, "would you like to change chicken count(%u) [y/n]: ", *(_DWORD *)(v5 + 60));
  2641.  
  2642.   if ( (unsigned __int8)read_yes_or_no(fd, (int)nptr) == 121 )
  2643.  
  2644.   {
  2645.  
  2646.     write_string(fd, "enter new chicken count: ");
  2647.  
  2648.     v4 = read_x_bytes_or_til_escape_char(fd, (int)nptr, 0x257u, 10);
  2649.  
  2650.     nptr[v4] = 0;
  2651.  
  2652.     if ( admin )
  2653.  
  2654.       *(_DWORD *)(v5 + 60) = atoi(nptr);
  2655.  
  2656.     else
  2657.  
  2658.       write_string(fd, "you don't have enough permissions to adjust chickens\n");
  2659.  
  2660.   }
  2661.  
  2662.   write_string(fd, "would you like to change monies(%u) [y/n]: ", *(_DWORD *)(v5 + 64));
  2663.  
  2664.   if ( (unsigned __int8)read_yes_or_no(fd, (int)nptr) == 121 )
  2665.  
  2666.   {
  2667.  
  2668.     write_string(fd, "enter new monies: ");
  2669.  
  2670.     v4 = read_x_bytes_or_til_escape_char(fd, (int)nptr, 0x257u, 10);
  2671.  
  2672.     nptr[v4] = 0;
  2673.  
  2674.     if ( admin )
  2675.  
  2676.       *(_DWORD *)(v5 + 64) = atoi(nptr);
  2677.  
  2678.     else
  2679.  
  2680.       write_string(fd, "you don't have enough permissions to add monies\n");
  2681.  
  2682.   }
  2683.  
  2684.   write_string(fd, "would you like to change your perms(%u) [y/n]: ", *(_DWORD *)(v5 + 56));
  2685.  
  2686.   if ( (unsigned __int8)read_yes_or_no(fd, (int)nptr) == 121 )
  2687.  
  2688.   {
  2689.  
  2690.     write_string(fd, "enter new perm: ");
  2691.  
  2692.     nptr[v4] = 0;
  2693.  
  2694.     if ( admin )
  2695.  
  2696.       *(_DWORD *)(v5 + 56) = atoi(nptr);
  2697.  
  2698.     else
  2699.  
  2700.       write_string(fd, "you don't have enough permissions to change permissions\n");
  2701.  
  2702.   }
  2703.  
  2704.   write_string(fd, "finished updates \n");
  2705.  
  2706.   return 0;
  2707.  
  2708. }
  2709.  
  2710. // 804E420: using guessed type int dword_804E420;
  2711.  
  2712.  
  2713.  
  2714. //----- (0804B6F5) --------------------------------------------------------
  2715.  
  2716. int __cdecl try_login(int fd, int s1, char *a3)
  2717.  
  2718. {
  2719.  
  2720.   int result; // eax@1
  2721.  
  2722.   int v4; // eax@1
  2723.  
  2724.   int v5; // eax@1
  2725.  
  2726.   const char s[600]; // [sp+14h] [bp-264h]@1
  2727.  
  2728.   int v7; // [sp+26Ch] [bp-Ch]@1
  2729.  
  2730.  
  2731.  
  2732.   send_with_or_without_null(fd, "enter username: ", 0);
  2733.  
  2734.   v4 = read_x_bytes_or_til_escape_char(fd, s1, 0x257u, 10);
  2735.  
  2736.   v7 = v4;
  2737.  
  2738.   *(_BYTE *)(s1 + v4) = 0;
  2739.  
  2740.   send_with_or_without_null(fd, "enter password: ", 0);
  2741.  
  2742.   v5 = read_x_bytes_or_til_escape_char(fd, (int)s, 0x257u, 10);
  2743.  
  2744.   v7 = v5;
  2745.  
  2746.   s[v5] = 0;
  2747.  
  2748.   result = check_username_n_pass(fd, a3, (const char *)s1, s);
  2749.  
  2750.   if ( result )
  2751.  
  2752.     result = send_with_or_without_null(fd, "Bad username or pass: ", 0);
  2753.  
  2754.   return result;
  2755.  
  2756. }
  2757.  
  2758.  
  2759.  
  2760. //----- (0804B7E0) --------------------------------------------------------
  2761.  
  2762. int __cdecl print_menu(int fd)
  2763.  
  2764. {
  2765.  
  2766.   send_with_or_without_null(fd, "\n\nfantasy chicken farmin league\n", 0);
  2767.  
  2768.   if ( logged_in )
  2769.  
  2770.   {
  2771.  
  2772.     write_string(fd, "\n\nmenu    (%s)\n", &s1);
  2773.  
  2774.     write_string(fd, " L) logout\n");
  2775.  
  2776.     write_string(fd, " b) buy chickens\n");
  2777.  
  2778.     write_string(fd, " i) incinerate money\n");
  2779.  
  2780.     write_string(fd, " s) sell eggs\n");
  2781.  
  2782.     write_string(fd, " p) display my info\n");
  2783.  
  2784.     write_string(fd, " u) update my info\n");
  2785.  
  2786.     if ( admin )
  2787.  
  2788.       write_string(fd, " P) print userlist\n");
  2789.  
  2790.   }
  2791.  
  2792.   else
  2793.  
  2794.   {
  2795.  
  2796.     write_string(fd, "\n\nmenu\n");
  2797.  
  2798.     write_string(fd, " c) create account\n");
  2799.  
  2800.     write_string(fd, " l) login\n");
  2801.  
  2802.   }
  2803.  
  2804.   return write_string(fd, " q) quit \n");
  2805.  
  2806. }
  2807.  
  2808. // 804E420: using guessed type int dword_804E420;
  2809.  
  2810. // 804E424: using guessed type int dword_804E424;
  2811.  
  2812.  
  2813.  
  2814. //----- (0804B90A) --------------------------------------------------------
  2815.  
  2816. int __cdecl readfromfd(FILE *stream, int a2, unsigned int a3, char a4)
  2817.  
  2818. {
  2819.  
  2820.   char ptr; // [sp+2Bh] [bp-Dh]@2
  2821.  
  2822.   unsigned int i; // [sp+2Ch] [bp-Ch]@1
  2823.  
  2824.  
  2825.  
  2826.   for ( i = 0; ; ++i )
  2827.  
  2828.   {
  2829.  
  2830.     if ( !fread(&ptr, 1u, 1u, stream) )
  2831.  
  2832.       return -1;
  2833.  
  2834.     if ( ptr == a4 )
  2835.  
  2836.       return i;
  2837.  
  2838.     if ( i >= a3 )
  2839.  
  2840.       break;
  2841.  
  2842.     *(_BYTE *)(i + a2) = ptr;
  2843.  
  2844.   }
  2845.  
  2846.   return -1;
  2847.  
  2848. }
  2849.  
  2850.  
  2851.  
  2852. //----- (0804B9E6) --------------------------------------------------------
  2853.  
  2854. void *__cdecl allocandfillstruct(int fd, sruct *head, const char *username, const char *info, const char *office, const char *password, int id, int perms, int money, int chickens, int eggs)
  2855.  
  2856. {
  2857.  
  2858.   void *result; // eax@1
  2859.  
  2860.   void *v12; // [sp+1Ch] [bp-Ch]@1
  2861.  
  2862.  
  2863.  
  2864.   result = malloc(0x9Cu);
  2865.  
  2866.   newuser = result;
  2867.  
  2868.   if ( result )
  2869.  
  2870.   {
  2871.  
  2872.     strcpy((char *)newuser.user, username);
  2873.  
  2874.     strcpy((char *)newuser.info, info);
  2875.  
  2876.     strcpy((char *)newuser.office, office);
  2877.  
  2878.     strcpy((char *)newuser.password, password);
  2879.  
  2880.     *((_DWORD *)v12 + 18) = id; //id
  2881.  
  2882.     *((_DWORD *)v12 + 14) = perms;// perm
  2883.  
  2884.     *((_DWORD *)v12 + 16) = money; // monies
  2885.  
  2886.     *((_DWORD *)v12 + 15) = chickens; // chickens
  2887.  
  2888.     *((_DWORD *)v12 + 17) = eggs; // eggs
  2889.  
  2890.     *((_DWORD *)v12 + 19) = *(_DWORD *)(head + 76); // link first ptr to former first
  2891.  
  2892.     *((_DWORD *)v12 + 20) = head; // link last pointer to head
  2893.  
  2894.     *(_DWORD *)(a2 + 76) = v12; // set head next ptr to this
  2895.  
  2896.     result = 0;
  2897.  
  2898.   }
  2899.  
  2900.   return result;
  2901.  
  2902. }
  2903.  
  2904.  
  2905. //----- (0804BAB7) --------------------------------------------------------
  2906.  
  2907. signed int __cdecl opendbandinit(const char *filename, int head, int fd)
  2908.  
  2909. {
  2910.  
  2911.   char password[59ish]; // [sp+39h] [bp-2FFh]@1
  2912.  
  2913.   char office[33]; // [sp+5Ah] [bp-2DEh]@1
  2914.  
  2915.   char info[20]; // [sp+6Eh] [bp-2CAh]@1
  2916.  
  2917.   char username[50]; // [sp+A0h] [bp-298h]@1
  2918.  
  2919.   char v8[20]; // [sp+B4h] [bp-284h]@3
  2920.  
  2921.   signed int v9; // [sp+30Ch] [bp-2Ch]@1
  2922.  
  2923.   int v10; // [sp+310h] [bp-28h]@1
  2924.  
  2925.   int v11; // [sp+314h] [bp-24h]@1
  2926.  
  2927.   int id; // [sp+318h] [bp-20h]@6
  2928.  
  2929.   int perms; // [sp+31Ch] [bp-1Ch]@16
  2930.  
  2931.   int chickens; // [sp+320h] [bp-18h]@18
  2932.  
  2933.   int eggs; // [sp+324h] [bp-14h]@20
  2934.  
  2935.   int money; // [sp+328h] [bp-10h]@22
  2936.  
  2937.   FILE *v17; // [sp+32Ch] [bp-Ch]@1
  2938.  
  2939.  
  2940.  
  2941.   v9 = 0;
  2942.  
  2943.   v10 = 0;
  2944.  
  2945.   v11 = 0;
  2946.  
  2947.   bzero(&username, 0x14u);
  2948.  
  2949.   bzero(&info, 0x32u);
  2950.  
  2951.   bzero(&office, 0x14u);
  2952.  
  2953.   bzero(&password, 0x21u);
  2954.  
  2955.   v17 = fopen(filename, "rb");
  2956.  
  2957.   if ( v17 )
  2958.  
  2959.   {
  2960.  
  2961.     while ( 1 )
  2962.  
  2963.     {
  2964.  
  2965.       v10 = readfromfd(v17, (int)&v8, 0x257u, 10);
  2966.  
  2967.       if ( v10 == -1 )
  2968.  
  2969.         break;
  2970.  
  2971.       *(&v8 + v10) = 0;
  2972.  
  2973.       if ( strcmp(&v8, "[user db]") )
  2974.  
  2975.       {
  2976.  
  2977.         if ( strcmp(&v8, "[user]") )
  2978.  
  2979.         {
  2980.  
  2981.           v9 = 1;
  2982.  
  2983.           break;
  2984.  
  2985.         }
  2986.  
  2987.         ++v11;
  2988.  
  2989.         v10 = readfromfd(v17, (int)&v8, 0x257u, 10);
  2990.  
  2991.         if ( v10 != -1 )
  2992.  
  2993.         {
  2994.  
  2995.           *(&v8 + v10) = 0;
  2996.  
  2997.           id = atoi(&v8); // size first thing after user
  2998.  
  2999.         }
  3000.  
  3001.         v10 = readfromfd(v17, (int)&v8, 0x257u, 10);
  3002.  
  3003.         if ( v10 != -1 )
  3004.  
  3005.         {
  3006.  
  3007.           *(&v8 + v10) = 0;
  3008.  
  3009.           strncpy(&username, &v8, 0x14u);
  3010.  
  3011.         }
  3012.  
  3013.         v10 = readfromfd(v17, (int)&v8, 0x257u, 10);
  3014.  
  3015.         if ( v10 != -1 )
  3016.  
  3017.         {
  3018.  
  3019.           *(&v8 + v10) = 0;
  3020.  
  3021.           strncpy(&info, &v8, 0x32u);
  3022.  
  3023.         }
  3024.  
  3025.         v10 = readfromfd(v17, (int)&v8, 0x257u, 10);
  3026.  
  3027.         if ( v10 != -1 )
  3028.  
  3029.         {
  3030.  
  3031.           *(&v8 + v10) = 0;
  3032.  
  3033.           strncpy(&office, &v8, 0x14u);
  3034.  
  3035.         }
  3036.  
  3037.         v10 = readfromfd(v17, (int)&v8, 0x257u, 10);
  3038.  
  3039.         if ( v10 != -1 )
  3040.  
  3041.         {
  3042.  
  3043.           *(&v8 + v10) = 0;
  3044.  
  3045.           strncpy(&password, &v8, 0x21u);
  3046.  
  3047.         }
  3048.  
  3049.         v10 = readfromfd(v17, (int)&v8, 0x257u, 10);
  3050.  
  3051.         if ( v10 != -1 )
  3052.  
  3053.         {
  3054.  
  3055.           *(&v8 + v10) = 0;
  3056.  
  3057.           perms = atoi(&v8);
  3058.  
  3059.         }
  3060.  
  3061.         v10 = readfromfd(v17, (int)&v8, 0x257u, 10);
  3062.  
  3063.         if ( v10 != -1 )
  3064.  
  3065.         {
  3066.  
  3067.           *(&v8 + v10) = 0;
  3068.  
  3069.           chickens = atoi(&v8);
  3070.  
  3071.         }
  3072.  
  3073.         v10 = readfromfd(v17, (int)&v8, 0x257u, 10);
  3074.  
  3075.         if ( v10 != -1 )
  3076.  
  3077.         {
  3078.  
  3079.           *(&v8 + v10) = 0;
  3080.  
  3081.           eggs = atoi(&v8);
  3082.  
  3083.         }
  3084.  
  3085.         v10 = readfromfd(v17, (int)&v8, 0x257u, 10);
  3086.  
  3087.         if ( v10 != -1 )
  3088.  
  3089.         {
  3090.  
  3091.           *(&v8 + v10) = 0;
  3092.  
  3093.           money = atoi(&v8);
  3094.  
  3095.         }
  3096.  
  3097.         if ( allocandfillstruct(fd, head, &username, &info, &office, &password, id, perms, money, chickens, eggs) )
  3098.  
  3099.         {
  3100.  
  3101.           v9 = 1;
  3102.  
  3103.           write_string(fd, "insert failed.\n");
  3104.  
  3105.           break;
  3106.  
  3107.         }
  3108.  
  3109.       }
  3110.  
  3111.     }
  3112.  
  3113.     fclose(v17);
  3114.  
  3115.   }
  3116.  
  3117.   else
  3118.  
  3119.   {
  3120.  
  3121.     write_string(fd, "attempted %s.\n", filename);
  3122.  
  3123.     v9 = 1;
  3124.  
  3125.   }
  3126.  
  3127.   return v9;
  3128.  
  3129. }
  3130.  
  3131.  
  3132.  
  3133. //----- (0804C067) --------------------------------------------------------
  3134.  
  3135. void __cdecl quit(int fd)
  3136.  
  3137. {
  3138.  
  3139.   send_with_or_without_null(fd, "cya\n", 0);
  3140.  
  3141.   close(fd);
  3142.  
  3143.   exit(0);
  3144.  
  3145. }
  3146.  
  3147.  
  3148.  
  3149. //----- (0804C09F) --------------------------------------------------------
  3150.  
  3151. int __cdecl newprices(int a1)
  3152.  
  3153. {
  3154.  
  3155.   int v1; // edx@1
  3156.  
  3157.   int result; // eax@11
  3158.  
  3159.   signed int v3; // [sp+8h] [bp-10h]@1
  3160.  
  3161.   int v4; // [sp+Ch] [bp-Ch]@6
  3162.  
  3163.  
  3164.  
  3165.   random = rand() % 5;
  3166.  
  3167.   v3 = random - 2;
  3168.  
  3169.   if ( random != 2 )
  3170.  
  3171.   {
  3172.  
  3173.     chickenprice += v3;
  3174.  
  3175.     eggprice += v3 / 2;
  3176.  
  3177.     if ( !eggprice )
  3178.  
  3179.       eggprice = 1;
  3180.  
  3181.     if ( !eggprice )
  3182.  
  3183.       eggprice = 1;
  3184.  
  3185.   }
  3186.  
  3187.   curuser = a1;
  3188.  
  3189.   while ( 1 )
  3190.  
  3191.   {
  3192.  
  3193.     result = curuser.next;
  3194.  
  3195.     if ( !result )
  3196.  
  3197.       break;
  3198.  
  3199.     curuser = curuser.next;
  3200.  
  3201.     if ( curuser.money )
  3202.  
  3203.     {
  3204.  
  3205.       if ( v3 == 1 )
  3206.  
  3207.         curuser.money += curuser.money >> 2;
  3208.  
  3209.         curuser.uid = curuser.money + curuser.uid - (curuser.money >> 3);
  3210.  
  3211.     }
  3212.  
  3213.   }
  3214.  
  3215.   return result;
  3216.  
  3217. }
  3218.  
  3219.  
  3220.  
  3221. //----- (0804C18B) --------------------------------------------------------
  3222.  
  3223. void __cdecl sub_804C18B(int fd)
  3224.  
  3225. {
  3226.  
  3227.   unsigned int v1; // eax@1
  3228.  
  3229.   int nptr; // [sp+26Ch] [bp-26Ch]@7
  3230.  
  3231.   char v3[4]; // [sp+4C4h] [bp-14h]@1
  3232.  
  3233.   void *s; // [sp+4C8h] [bp-10h]@1
  3234.  
  3235.   FILE *stream; // [sp+4CCh] [bp-Ch]@40
  3236.  
  3237.  
  3238.  
  3239.   *(_DWORD *)v3 = 0;
  3240.  
  3241.   v1 = time(0);
  3242.  
  3243.   srand(v1);
  3244.  
  3245.   s = malloc(0x9Cu);
  3246.  
  3247.   if ( !s )
  3248.  
  3249.   {
  3250.  
  3251.     send_with_or_without_null(fd, "can't allocate user_list, quitting\n", 0);
  3252.  
  3253.     quit(fd);
  3254.  
  3255.   }
  3256.  
  3257.   bzero(s, 0x9Cu);
  3258.  
  3259.   *((_DWORD *)s + 19) = 0;
  3260.  
  3261.   *((_DWORD *)s + 20) = 0;
  3262.  
  3263.   log_out();
  3264.  
  3265.   if ( opendbandinit("/home/fcfl/user.db", (int)s, fd) )
  3266.  
  3267.   {
  3268.  
  3269.     send_with_or_without_null(fd, "can't read user db, quitting\n", 0);
  3270.  
  3271.     quit(fd);
  3272.  
  3273.   }
  3274.  
  3275.   while ( 1 )
  3276.  
  3277.   {
  3278.  
  3279.         newprices((int)s);
  3280.  
  3281.         print_menu(fd);
  3282.  
  3283.         *(_DWORD *)v3 = read_x_bytes_or_til_escape_char(fd, (int)&nptr, 0x257u, 10);
  3284.  
  3285.         nptr[v3] = 0;
  3286.  
  3287.         write_string(fd, "%d: %s\n", *(_DWORD *)v3, &nptr);
  3288.  
  3289.         if ( *(_DWORD *)v3 == 1 ) // one byte read {
  3290.  
  3291.             if ( (_BYTE)nptr != aC[0] || logged_in )
  3292.  
  3293.             {
  3294.  
  3295.                     if ( (_BYTE)nptr != asc_804D115[0] || logged_in )
  3296.  
  3297.                     {
  3298.  
  3299.                         if ( (_BYTE)nptr == aS_1[0] && logged_in )
  3300.  
  3301.                         {
  3302.  
  3303.                             buy_eggs(fd, (const char *)&nptr, (int)s);
  3304.  
  3305.                         }
  3306.  
  3307.                         else
  3308.  
  3309.                         {
  3310.  
  3311.                             if ( (_BYTE)nptr == aI[0] && logged_in )
  3312.  
  3313.                             {
  3314.  
  3315.                                 burn_money(fd, (const char *)&nptr, (int)s);
  3316.  
  3317.                             }
  3318.  
  3319.                             else
  3320.  
  3321.                             {
  3322.  
  3323.                                 if ( (_BYTE)nptr == aB[0] && logged_in )
  3324.    
  3325.                                 {
  3326.  
  3327.                                         buy_chickens(fd, (const char *)&nptr, (int)s);
  3328.  
  3329.                                 }
  3330.  
  3331.                                 else
  3332.  
  3333.                                 {
  3334.  
  3335.                                         if ( (_BYTE)nptr == aU[0] && logged_in )
  3336.  
  3337.                                         {
  3338.  
  3339.                                             change_info(fd, (const char *)&nptr, (int)s);
  3340.  
  3341.                                         }
  3342.  
  3343.                                         else
  3344.  
  3345.                                         {
  3346.  
  3347.                                             if ( (_BYTE)nptr == 'p' && logged_in )
  3348.  
  3349.                                             {
  3350.  
  3351.                                                     print_current_user(fd, (int)s);
  3352.  
  3353.                                             }
  3354.  
  3355.                                             else
  3356.  
  3357.                                             {
  3358.  
  3359.                                                     if ( (_BYTE)nptr == 'L' && logged_in )
  3360.  
  3361.                                                     {
  3362.  
  3363.                                                         log_out();
  3364.  
  3365.                                                     }
  3366.  
  3367.                                                     else
  3368.  
  3369.                                                     {
  3370.  
  3371.                                                         if ( (_BYTE)nptr == aP_0[0] && logged_in && admin )
  3372.  
  3373.                                                         {
  3374.  
  3375.                                                             print_all_users(fd, (int)s);
  3376.  
  3377.                                                         }
  3378.  
  3379.                                                         else
  3380.  
  3381.                                                         {
  3382.  
  3383.                                                             if ( (_BYTE)nptr == '6' && logged_in && admin )
  3384.  
  3385.                                                             {
  3386.  
  3387.                                                                 stream = fopen("/home/fcfl/key", "rb");
  3388.  
  3389.                                                                 *(_DWORD *)v3 = readfromfd(stream, (int)&nptr, 0x257u, 10);
  3390.  
  3391.                                                                 if ( *(_DWORD *)v3 != -1 )
  3392.  
  3393.                                                                 {
  3394.  
  3395.                                                                  *((_BYTE *)&nptr + *(_DWORD *)v3) = 0;
  3396.  
  3397.                                                                  send_with_or_without_null(fd, (const char *)&nptr, 1);
  3398.  
  3399.                                                                  }
  3400.  
  3401.                                                             }
  3402.  
  3403.                                                             else
  3404.  
  3405.                                                             {
  3406.  
  3407.                                                                 if ( (_BYTE)nptr == 'q' )
  3408.  
  3409.                                                                     quit(fd);
  3410.  
  3411.                                                                 send_with_or_without_null(fd, "that's not a valid option", 0);
  3412.  
  3413.                                                             }
  3414.  
  3415.                                                         }
  3416.  
  3417.                                                     }
  3418.  
  3419.                                             }
  3420.  
  3421.                                         }
  3422.  
  3423.                                 }
  3424.  
  3425.                             }
  3426.  
  3427.                         }
  3428.  
  3429.                     }
  3430.  
  3431.                     else
  3432.  
  3433.                     {
  3434.  
  3435.                         try_login(fd, (int)&nptr, (char *)s);
  3436.  
  3437.                     }
  3438.  
  3439.             }
  3440.  
  3441.             else
  3442.  
  3443.             {
  3444.  
  3445.                     create_user(fd, (const char *)&nptr, (int)s);
  3446.  
  3447.             }
  3448.  
  3449.         }
  3450.  
  3451.         else
  3452.  
  3453.         {
  3454.  
  3455.             *(_DWORD *)v3 = 0;
  3456.  
  3457.             send_with_or_without_null(fd, "that's not a valid option", 0);
  3458.  
  3459.         }
  3460.  
  3461.   }
  3462.  
  3463. }
  3464.  
  3465. // 804E420: using guessed type int dword_804E420;
  3466.  
  3467. // 804E424: using guessed type int dword_804E424;
  3468.  
  3469.  
  3470.  
  3471. //----- (0804C5F0) --------------------------------------------------------
  3472.  
  3473. void __cdecl sub_804C5F0()
  3474.  
  3475. {
  3476.  
  3477.   ;
  3478.  
  3479. }
  3480.  
  3481.  
  3482.  
  3483. //----- (0804C600) --------------------------------------------------------
  3484.  
  3485. int *__cdecl sub_804C600()
  3486.  
  3487. {
  3488.  
  3489.   init_proc();
  3490.  
  3491.   return &dword_804E1D8;
  3492.  
  3493. }
  3494.  
  3495. // 804E1D8: using guessed type int dword_804E1D8;
  3496.  
  3497.  
  3498.  
  3499. //----- (0804C65A) --------------------------------------------------------
  3500.  
  3501. void __cdecl sub_804C65A()
  3502.  
  3503. {
  3504.  
  3505.   ;
  3506.  
  3507. }
  3508.  
  3509.  
  3510.  
  3511. //----- (0804C660) --------------------------------------------------------
  3512.  
  3513. void (*__cdecl sub_804C660())(void)
  3514.  
  3515. {
  3516.  
  3517.   void (*result)(void); // eax@1
  3518.  
  3519.   int *v1; // ebx@2
  3520.  
  3521.  
  3522.  
  3523.   result = (void (*)(void))dword_804E1D8;
  3524.  
  3525.   if ( dword_804E1D8 != -1 )
  3526.  
  3527.   {
  3528.  
  3529.     v1 = &dword_804E1D8;
  3530.  
  3531.     do
  3532.  
  3533.     {
  3534.  
  3535.       --v1;
  3536.  
  3537.       result();
  3538.  
  3539.       result = (void (*)(void))*v1;
  3540.  
  3541.     }
  3542.  
  3543.     while ( *v1 != -1 );
  3544.  
  3545.   }
  3546.  
  3547.   return result;
  3548.  
  3549. }
  3550.  
  3551. // 804E1D8: using guessed type int dword_804E1D8;
  3552.  
  3553.  
  3554.  
  3555. //----- (0804C68C) --------------------------------------------------------
  3556.  
  3557. void __cdecl term_proc()
  3558.  
  3559. {
  3560.  
  3561.   sub_8048CB0();
  3562.  
  3563. }
  3564.  
  3565.  
  3566.  
  3567. #error "There were 1 decompilation failure(s) on 48 function(s)"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement