🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.os.linux.programowanie
Article #740

Re: fopen i tylda (home dir)

#740
From: Cezary H. Noweta
Date: Fri, 01 Oct 1999 08:42
77 lines
2981 bytes
Witam,

Michał Kochanowicz wrote:
> Próbuję w programie użyć fopen("~/filename", "r"); Niestety nie działa
> to - funkcja zwraca NULL. Czy jest niedozwolone takie użycie tyldy? A
> jeśli tak, to jak znaleźć katalog domowy usera, przecież nie musi być to
> /home/username - np. na uczelni mam /home/miriam/stud/mkochano...

W zasadzie wszystko juz zostalo powiedziane w poprzednich Replies. Dodam
tylko, ze jesli zmienna HOME nie jest ustawiona, to BASH (inne shelle
nie wiem) home_dir wyszukuje w passwd na podstawie uzytkownika, ktory
_uruchomil_ (nie efektywnego przy suid) SHELLA.

Ponizszy przyklad otwiera plik "~/file". Funkcja expand_tilde(char *buff)
wpisuje do buff home_dir (bez koncowego '/') i zwraca 0 jesli OK lub
!0 jesli wystapil blad.

------
  expand.c
------
#include <pwd.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>

#ifndef PATH_MAX
#include <limits.h>
#endif

int expand_by_env(char *buff)
{
  char *home = getenv("HOME");

  return(!home || !memcpy(buff, home, strlen(home) + 1));
}

int expand_by_uid(char *buff)
{
  uid_t uid = getuid();
  struct passwd *pw_ent;

  setpwent();
  while ( (pw_ent = getpwent()) && pw_ent->pw_uid != uid );
  endpwent();

  return(!pw_ent || !memcpy(buff, pw_ent->pw_dir, strlen(pw_ent->pw_dir) + 1));
}

int expand_tilde(char *buff)
{
  return(expand_by_env(buff) && expand_by_uid(buff));
}

int main()
{
  char file_name[PATH_MAX + 1];

  if ( expand_tilde(file_name) ) {
    fprintf(stderr, "ERROR: HOME unset & (out of memory | not such user)\n");
    return(-1);
  }

  memcpy(file_name + strlen(file_name), "/file", strlen("/file") + 1);
  printf("Filename after expanding: %s\n", file_name);
  printf("FILE *: %p\n", fopen(file_name, "r"));

  return(0);
}
------

  -- pozdrawiam

-- 
Cezary H. Noweta                 90-237 LODZ, ul. J.Matejki 34/38 POLAND
(chn@irys.usun.drugiitrzeciczlon.uni.lodz.pl)    +48 42 6356013, 6356012
University of Lodz - Main Library                            fax 6781678
Technical Details
Message-ID: <37F473F0.B9139F68@irys.usundrugiczlon.uni.lodz.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!mat.uni.torun.pl!uw.edu.pl!news.icm.edu.pl!pwr.wroc.pl!panorama.wcss.wroc.pl!news.man.lodz.pl!not-for-mail
References: <37F3CC41.43E89A1A@ee.pw.edu.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!mat.uni.torun.pl!uw.edu.pl!news.icm.edu.pl!pwr.wroc.pl!panorama.wcss.wroc.pl!news.man.lodz.pl!not-for-mail
From: "Cezary H. Noweta" <chn@irys.usundrugiczlon.uni.lodz.pl>
Newsgroups: pl.comp.os.linux.programowanie
Subject: Re: fopen i tylda (home dir)
Date: Fri, 01 Oct 1999 10:42:24 +0200
Organization: Biblioteka Uniwersytecka w Lodzi
Lines: 77
Message-ID: <37F473F0.B9139F68@irys.usundrugiczlon.uni.lodz.pl>
References: <37F3CC41.43E89A1A@ee.pw.edu.pl>
NNTP-Posting-Host: chncc.bul.uni.lodz.pl
Mime-Version: 1.0
X-Trace: kujawiak.man.lodz.pl 938767347 23321 212.191.71.33 (1 Oct 1999 08:42:27 GMT)
X-Complaints-To: abuse@man.lodz.pl
NNTP-Posting-Date: 1 Oct 1999 08:42:27 GMT
X-Mailer: Mozilla 4.61 [en] (Win95; I)
X-Accept-Language: pl,en
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit