Bu amaçla kullanılan işlevler ve veri yapıları
utmp.h başlık dosyasında bildirilmiştir.
exit_status veri yapısı, kullanıcı hesapları veritabanında DEAD_PROCESS olarak imlenmiş süreçlerin çıkış durumları ile ilgili bilgileri saklamakta kullanılır.
-
short int e_termination
Sürecin sonlanma durumu.
-
short int e_exit
Sürecin çıkış durumu.
utmp veri yapısı kullanıcı veritabanındaki girdiler hakkında bilgileri tutar. GNU sisteminde şu üyelere sahiptir:
-
short int ut_type
Oturum açma türünü belirtir. EMPTY, RUN_LVL,
BOOT_TIME, OLD_TIME, NEW_TIME, INIT_PROCESS,
LOGIN_PROCESS, USER_PROCESS, DEAD_PROCESS ve
ACCOUNTING sabitlerinden biri olabilir.
-
pid_t ut_pid
Oturumu açan sürecin süreç kimliği numarası.
-
char ut_line[]
Uçbirimin aygıt ismi (/dev/ olmaksızın).
-
char ut_id[]
Sürecin inittab kimliği.
-
char ut_user[]
Kullanıcının oturum açma ismi.
-
char ut_host[]
Kullanıcının kullanarak bağlantı kurduğu konağın ismi.
-
struct exit_status ut_exit
DEAD_PROCESS olarak imli sürecin çıkış durumu.
-
long ut_session
Pencereleme için kullanılan oturum kimliği.
-
struct timeval ut_tv
Girdinin yapıldığı zaman. OLD_TIME türündeki girdiler için sistem zamanı değişmeden önceki zaman, NEW_TIME türündeki girdiler için ise sistem zamanı değiştikten sonraki zamandır.
-
int32_t ut_addr_v6[4]
Uzak konağın internet adresi.
ut_type, ut_pid, ut_id, ut_tv ve ut_host alanları tüm sistemlerde yoktur. Taşınabilir uygulamalar bu duruma hazırlıklı olmalıdır. Bunu yapmaya yardımcı olmak için, utmp.h başlık dosyasında ilgili alanın varlığını belirleyen _HAVE_UT_TYPE, _HAVE_UT_PID, _HAVE_UT_ID, _HAVE_UT_TV ve _HAVE_UT_HOST makroları tanımlanmıştır. Yazılımcı bu durumları yazılımda #ifdef'ler ile sınayabilir.
Aşağıdaki makrolar utmp yapısının ut_type üyesinde kullanılabilecek değerler olarak tanımlanmıştır. Değerler tamsayı sabitlerdir.
- EMPTY
Bu makro girdinin hiçbir geçerli kullanıcı hesabı bilgisi içermediğini belirtir.
- RUN_LVL
Bu makro sistem çalışma seviyesi ile ilgilidir.
- BOOT_TIME
Bu makro sistemin açıldığı zaman ile ilgilidir.
- OLD_TIME
Bu makro sistem saatinin değiştiği zaman ile ilgilidir.
- NEW_TIME
Bu makro sistem değiştikten sonraki zaman ile ilgilidir.
- INIT_PROCESS
Bu makro init süreci ile çatallanan bir süreç ile ilgilidir.
- LOGIN_PROCESS
Bu makro kullanıcının oturum açarken kullandığı ilk süreç ile ilgilidir.
- USER_PROCESS
Bir kullanıcı süreci ile ilgilidir.
- DEAD_PROCESS
Sonlandırılmış bir süreç ile ilgilidir.
- ACCOUNTING
ut_line, ut_id, ut_user ve ut_host dizilerinin boyutları sizeof işleci kullanılarak bulunabilir.
time_t türünde bir üye zamanla ilgili bilgi tutabildiğinden çoğu eski sistemde ut_tv üyesi yerine ut_time üyesi bulunur. Bununa birlikte, sadece geriye uyumluluk adına, utmp.h başlık dosyasında ut_time, ut_tv.tv_sec için bir takma ad olarak tanımlanır.
Bu işlev kullanıcı hesapları veritabanını taramaya başlamak için açar. Girdileri okumak için getutent, getutid veya getutline işlevlerini; yazmak için ise pututline işlevini kullanabilirsiniz.
Veritabanı zaten açıksa, girişi veritabanının başlangıcına ayarlar.
struct utmp *getutent | (void) |
işlev
getutent işlevi kullanıcı hesapları veritabanından sonraki girdiği okur. İşlevin sonraki çağrıları ile üzerine yazılabilecek durağan ayrılmış olarak girdiye bir gösterici ile döner. Yapının bir kopyasını saklamak için dönen verinin içeriğini başka bir değişkende saklamalı ya da veriyi kullanıcı tanımlı bir tamponda saklayan getutent_r işlevini kullanmalısınız.
Sonraki bir girdinin olmaması durumunda işlev bir boş gösterici döndürür.
Kullanıcı hesapları veritabanını kapatır.
struct utmp *getutid | (const struct utmp *id) |
işlev
Bu işlev veritabanında bulunulan noktadan ileri doğru id ile eşleşen girdiyi arar. Eğer id yapısının ut_type üyesindeki değer RUN_LVL, BOOT_TIME, OLD_TIME veya NEW_TIME ise ve veritabanındaki girdinin ut_type üyesi bunlardan biri ise eşleşme sağlanır. Eğer, id yapısının ut_type üyesindeki değer INIT_PROCESS, LOGIN_PROCESS, USER_PROCESS veya DEAD_PROCESS ise ve girdinin ut_type üyesindeki değer bu dördünden biri ise ve ut_id üyeleri aynıysa eşleşme sağlanır. Bununla birlikte eğer hem id'nin hem de okunan girdinin ut_id üyesi boşsa, bunun yerine ut_line üyesi ile eşleşme aranır. Eğer bir eşleşme sağlanırsa, getutid girdiye bir gösterici ile döner. Dönen gösterici durağan ayrılmış olduğundan sonuç sonraki bir getutent, getutid veya getutline çağrısı ile değişebilir. Elde ettiğiniz bilgiyi saklamak isterseniz yapı içeriğini bir değişkene kopyalamalısınız.
Bir eşleşme sağlanamadan veritabanının sonuna gelinmişse işlev bir boş gösterici ile döner.
getutid işlevi okunan son girdiyi arabellekleyebilir. Dolayısıyla, işlevi yapıyla eşleşen birden fazla girdiyi bulmak için kullanıyorsanız, her çağrıdan sonra durağan veriyi sıfırlamanız gerekir. Aksi takdirde, işlev her çağrıda aynı girdiye döner.
struct utmp *getutline | (const struct utmp *satır) |
işlev
Bu işlev veritabanında bulunulan noktadan ileri doğru ut_type değeri LOGIN_PROCESS veya USER_PROCESS olan ve hem satır hem de veritabanında ut_line üyesi eşleşen girdiyi arar. Eğer bir eşleşme sağlanırsa, getutline girdiye bir gösterici ile döner. Dönen gösterici durağan ayrılmış olduğundan sonuç sonraki bir getutent, getutid veya getutline çağrısı ile değişebilir. Elde ettiğiniz bilgiyi saklamak isterseniz yapı içeriğini bir değişkene kopyalamalısınız.
Bir eşleşme sağlanamadan veritabanının sonuna gelinmişse işlev bir boş gösterici ile döner.
getutline işlevi okunan son girdiyi arabellekleyebilir. Dolayısıyla, işlevi yapıyla eşleşen birden fazla girdiyi bulmak için kullanıyorsanız, her çağrıdan sonra durağan veriyi sıfırlamanız gerekir. Aksi takdirde, işlev her çağrıda aynı girdiye döner.
struct utmp *pututline | (const struct utmp *utmp) |
işlev
pututline işlevi kullanıcı hesapları veritabanında uygun yere *utmp girdisini yerleştirir. Girdiyi doğru yerde bulamazsa, girdiyi yerleştireceği doğru yeri bulmak için getutid işlevini kullanır. Ancak, bu getutent, getutid ve getutline tarafından döndürülen durağan yapıyı değiştirmeyecektir. Eğer bu arama başarısız olursa girdi veritabanına eklenir.
pututline işlevi kullanıcı hesapları veritabanına yerleştirilen girdinin bir kopyası ile döner. Girdi veritabanına eklenememişse, bir boş gösterici döner. Aşağıdaki errno hata durumları bu işlev için tanımlanmıştır:
- EPERM
Süreç yeterli yetkiye sahip değil; kullanıcı hesapları veritabanını değiştiremezsiniz
Bahsi geçen tüm get* işlevleri bilgiyi saklanmadan önce bir durağan tampon içinde döndürür. Döndürülen veri başka bir evre tarafından değiştirilebileceğinden, bu çok evreli yazılımlarda sorun olabilir. Bu gibi durumlarda kullanılmak üzere GNU C kütüphanesi veriyi kullanıcı tanımlı tamponda döndüren üç ek işlev içerir.
int getutent_r | (struct utmp *tampon,
struct utmp **sonuç) |
işlev
getutent_r işlevi getutent işlevi ile aynıdır. Veritabanındaki sonraki girdi ile döner. Fakat veriyi bir durağan ayrılmış tamponda değil, tampon parametresi ile gösterilen tamponda saklar.
Çağrı başarılı olursa işlev 0 ile döner ve sonuç parametresi ile gösterilen gösterici değişkeni sonucu içeren tampona bir gösterici içerir (çok büyük olasılıkla bu tampon değeri olacaktır). Eğer bazı şeyler yanlış giderse işlev -1 ile döner.
Bu işlev bir GNU oluşumudur.
int getutid_r | (const struct utmp *id,
struct utmp *tampon,
struct utmp **sonuç) |
işlev
Bu işlev getutid gibi id içinde saklanan bilgi ile eşleşen sonraki girdi ile döner. Fakat sonuç, tampon parametresi ile gösterilen tamponda saklanır.
Çağrı başarılı olursa işlev 0 ile döner ve sonuç parametresi ile gösterilen gösterici değişkeni sonucu içeren tampona bir gösterici içerir (çok büyük olasılıkla bu tampon değeri olacaktır). Eğer bazı şeyler yanlış giderse işlev -1 ile döner.
Bu işlev bir GNU oluşumudur.
int getutline_r | (const struct utmp *satır,
struct utmp *tampon,
struct utmp **sonuç) |
işlev
Bu işlev getutline gibi satır içinde saklanan bilgi ile eşleşen sonraki girdi ile döner. Fakat sonuç, tampon parametresi ile gösterilen tamponda saklanır.
Çağrı başarılı olursa işlev 0 ile döner ve sonuç parametresi ile gösterilen gösterici değişkeni sonucu içeren tampona bir gösterici içerir (çok büyük olasılıkla bu tampon değeri olacaktır). Eğer bazı şeyler yanlış giderse işlev -1 ile döner.
Bu işlev bir GNU oluşumudur.
Kullanıcı hesapları veritabanına ek olarak çoğu sistem buna benzer başka veritabanları da içerir. Örneğin çoğu sistem evvelce açılmış oturumları bir günlük dosyasında tutar (genellikle /etc/wtmp veya /var/log/wtmp dosyasında).
Hangi veritabanını ile çalışılacağını belirtmek için şu işlev kullanılabilir:
int utmpname | (const char *dosya) |
işlev
utmpname işlevi çalışılacak veritabanını, ismi dosya ile belirtilen veritabanına değiştirir. Öntanımlı olarak, getutent, getutid, getutline ve pututline işlevleri kullanıcı hesapları veritabanı ile çalışır.
dosya argümanında kullanılmak üzere tanımlanmış makrolar:
Bu makro kullanıcı hesapları veritabanını belirtmek için kullanılır.
Bu makro kullanıcı hesapları günlük dosyasını belirtmek için kullanılır.
utmpname işlevi yeni isim başarıyla saklanmışsa 0 değeri ile, bir hata oluşmuşsa -1 değeri ile döner. utmpname işlevi veritabanını açmayı denemeyeceğinden dönüş değerinin veritabanının başarıyla açıldığına ilişkin bir bilgi vermeyeceğini unutmayın.
Özellikle günlükleme benzeri veritabanları ile çalışmak için GNU C kütüphanesi şu işlevi içerir:
void updwtmp | (const char *wtmp_dosyası,
const struct utmp *utmp) |
işlev
updwtmp işlevi *utmp girdisini wtmp_dosyası ile belirtilen veritabanına ekler. wtmp_dosyası argümanında kullanılabilecek değerler için utmpname işlevinin açıklamasına bakınız.
| Taşınabilirlik Bilgisi |
---|
Bir çok işletim sistemi bu işlevlerin bir alt kümesini içermekle birlikte, bunlar standartlaşmamıştır. Çoğunlukla dönüş değerleri arasında ince farklar bulunurken, struct utmp tanımları arasında da hatırı sayılır farklar vardır. GNU sistemi için yazılım geliştirirken, şüphesiz en iyisi bu bölümde açıklanan işlevlere sadık kalmaktır. Buna rağmen, yine de, yazılımınızın taşınabilir olmasını istiyorsanız XPG Kullanıcı Hesapları Veritabanı İşlevleri bölümünde bahsedilen XPG işlevlerini kullanmayı ya da Oturum Açma ve Kapatma bölümündeki BSD uyumlu işlevleri kullanmayı tercih edebilirsiniz.. |