Article View: pl.comp.os.linux.programowanie
Article #740Re: fopen i tylda (home dir)
From: Cezary H. Noweta
Date: Fri, 01 Oct 1999 08:42
Date: Fri, 01 Oct 1999 08:42
77 lines
2981 bytes
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-mailReferences:
<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